对于数组必须知道的一些运算
关于数组需要知道的基本运算
一维数组中
int a[] = { 1, 2, 3, 4};
printf("%d\n",sizeof(a));//16个字节; 求的是整数组的大小
printf("%d\n",sizeof(a+0));//4个字节; 求的是数组第一个元素地址的大小
printf("%d\n",sizeof(*a));//4个字节; 求的是数组第一个元素的大小
printf("%d\n",sizeof(a+1));//4个字节; 求的是数组第二个元素的地址
printf("%d\n",sizeof(a[1]));//4个字节; 求的是数组的第一个元素的大小
printf("%d\n",sizeof(&a));//4个字节; 整个数组的地址,即首元素的地址
printf("%d\n",sizeof(*&a));//16个字节;整个数组的大小
printf("%d\n",sizeof(&a+1));//4个字节;数组的下一个地址,指针
printf("%d\n",sizeof(&a[0]));//4个字节;数组的首元素
printf("%d\n",sizeof(&a[0]+1));//4个字节; 数组的第二个元素的地址
字符数组中sizeof与strlen的区别
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n",sizeof(arr));//6个字节;表示整个数组的大小
printf("%d\n",sizeof(arr+0));//4个字节;表示数组第一个元素的地址
printf("%d\n",sizeof(*arr));//1个字节; 数组第一个元素的大小
printf("%d\n",sizeof(arr[1]));//1个字节; 数组第一个元素的大小
printf("%d\n",sizeof(&arr));//4个字节; 整个数组的地址,即首元素的地址
printf("%d\n",sizeof(&a+1));//4个字节; 下一个个数组的地址,跳过整个数组
printf("%d\n",sizeof(&arr[0]+1));//4个字节; 数组的第二个元素的地址
strlen的运算
printf("%d\n",strlen(arr));//随机值
printf("%d\n",strlen(arr+0));///随机值 printf("%d\n",strlen(*arr));//error; strlen是求地址的长度,不是求值
printf("%d\n",strlen(arr[1]));//error; strlen是求地址的长度,不是求值
printf("%d\n",strlen(&arr));//4个字节; 整个数组的地址,即首元素的地址
printf("%d\n",strlen(&a+1));//随机值
printf("%d\n",strlen(&arr[0]+1));//随机值
char arr[] = "abcdef";
printf("%d\n",sizeof(arr));//7个字节;整个字符串的长度
printf("%d\n",sizeof(arr+0));//4个字节;表示数组第一个元素的地址
printf("%d\n",sizeof(*arr));//1个字节; 数组第一个元素的大小
printf("%d\n",sizeof(arr[1]));//1个字节; 数组第一个元素的大小
printf("%d\n",sizeof(&arr));//4个字节; 整个数组的地址,即首元素的地址
printf("%d\n",sizeof(&a+1));//4个字节; 下一个个数组的地址,跳过整个数组
printf("%d\n",sizeof(&arr[0]+1));//4个字节; 数组的第二个元素的地址
strlen的运算
printf("%d\n",strlen(arr));//6个字节,从数组的首元素地址开始遇到\0结束
printf("%d\n",strlen(arr+0));///6个字节,从数组的首元素地址开始遇到\0结束 printf("%d\n",strlen(*arr));//error; strlen是求地址的长度,不是求值
printf("%d\n",strlen(arr[1]));//error; strlen是求地址的长度,不是求值
printf("%d\n",strlen(&arr));//6个字节 ,从数组的首元素地址开始遇到\0结束
printf("%d\n",strlen(&a+1));//随机值
printf("%d\n",strlen(&arr[0]+1));//5个字节,从数组的第二个元素到\0结束
char *p = "abcdef";
printf("%d\n",sizeof(p));//4个字节;
指针变量的大小(在32位机)
printf("%d\n",sizeof(p+1));//4个字节; 指针变量的大小(在32位机)
printf("%d\n",sizeof(*p));//1个字节; 求的是数组第一个元素的大小
printf("%d\n",sizeof(p[0]));//1个字节; 求的是数组的第一个元素的大小
printf("%d\n",sizeof(&p));//4个字节; 表示p的地址
printf("%d\n",sizeof(&p+1));//4个字节;p的下一个地址
printf("%d\n",sizeof(&p[0]+1));//4个字节; p的第二个元素的地址
strlen的运算
printf("%d\n",strlen(p));//6个字节;
指向p的第一个元素地址,遇到\0结束
printf("%d\n",strlen(p+1));//5个字节; 指向p的第一个元素地址,遇到\0结束
printf("%d\n",strlen(*p));//error
printf("%d\n",strlen(p[0]));// error
printf("%d\n",strlen(&p));//随机值
printf("%d\n",strlen(&p+1));//随机值
printf("%d\n",strlen(&p[0]+1));//5个字节; p的第二个元素的遇到\0结束
二维数组的一些运算
int a[3][4] = {0};
printf("%d\n",sizeof(a));//48个字节,求的是整数组的大小
printf("%d\n",sizeof(a[0][0]));//4个字节; 求的是数组第一个元素地址的大小
printf("%d\n",sizeof(a[0]));/16个字节; 求的是数组第一行元素地址的大小
printf("%d\n",sizeof(a[0]+1));//4个字节; 求的是第一行第一个元素地址
printf("%d\n",sizeof(a+1));//4个字节; 求的是数组的第二行第一个个元素的地址
printf("%d\n",sizeof(&a[0]+1));//4个字节; 数组的第二行地址
printf("%d\n",sizeof(*a));//16个字节;数组的第一行元素的地址
printf("%d\n",sizeof(&a[0]));//16个字节;不参与运算