####关于数组,我们必须学会下面的计算
//1.数组名单独放在sizeof()内部,数组名表示整个数组
所以sizeof(数组名)计算的是整个数组的大小,单位是字节
//2.&数组名,数组名表示整个数组
所以&数组名取出的是整个数组的地址
//3.除此之外,所有的数组名都表示首元素的地址
数组名+i相当于下标为i的地址
######一维数组
整型 int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));//16
- 数组名单独放在sizeof()内部,代表整个数组,所以计算的是整个数组的大小;
数组a里面有四个整型,所以输出 16。
printf("%d\n",sizeof(a+0));//4
- 数组名没有单独放在sizeof()内部,也没有和&连用,所以不代表整个数组,即为首元素地址,加0,即依旧为首元素地址,地址占四个字节,所以输出为 4。
printf("%d\n",sizeof(*a));//4
- 看sizeof内部,得到数组名代表首元素地址,但是 * 解引用首元素地址为首元素,整型为4个字节,所以依旧输出为 4 。
printf("%d\n",sizeof(a+1));//4
- 数组名+1表示下标为1的元素地址,即输出为 4 。
printf("%d\n",sizeof(a[1]));//4
- 即第二个元素的大小,输出为 4 。
printf("%d\n",sizeof(&a));//4
- &数组名,数组名表示整个数组,即取出整个数组的地址,所以输出为 4 。
//printf("%d\n",sizeof(*&a));//16
- (&a)表示整个数组的地址,但是‘ * ’ 解引用整个数组,即表示取出整个数组的元素;
- 即四个元素的字节大小,输出为 16 。
printf("%d\n",sizeof(&a+1));//4
- (&a)表示取出整个数组的地址,加 1 即表示跳过整个数组,停在最后一个元素4的后面;
- 但是依旧表示一个数组的地址,输出为 4 。
printf("%d\n",sizeof(&a[0]));//4
- a[0]即表示首元素,&a[0]即首元素地址,输出为 4 。
printf("%d\n",sizeof(&a[0]+1));
- 首元素地址加 1 ,即第二个元素地址,依旧是一个地址,输出也为 4 。
字符 char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));//6
- 数组名单独放在sizeof()内部,其表示整个数组;即求数组的大小;
- 数组里面有6个字符,所以输出为 6 。
printf("%d\n", sizeof(arr+0));//4
- arr+0代表首元素+0,则还是首元素地址,所以地址输出为 4 。
printf("%d\n", sizeof(*arr));//1
- 数组名表示首元素地址,被‘ * ’解引用为首元素,则字符大小为1个字节;
- 所以输出为 1 。
printf("%d\n", sizeof(arr[1]));//1
- 第二个元素的大小,输出为 1 。
printf("%d\n", sizeof(&arr));
- &数组名,数组名表示整个数组,所以表示取出整个数组的地址;
- 输出为 4 。
printf("%d\n", sizeof(&arr+1));
- &arr+1表示跳过整个数组,停在 f 的后面,依旧表示地址,输出为 4 。
printf("%d\n", sizeof(&arr[0]+1));
- 首元素地址+1表示第二个元素的地址,输出为 4 。
注意 strlen
printf("%d\n", strlen(arr));//随机值
- strlen求字符串长度,遇到字符串结束标志‘ \0 ’才能停下来,在这里,数组里面没有’\0’,所以,它停下来是个随机值。
printf("%d\n", strlen(arr+0));//随机值
- 数组名+0,依然表示首元素地址,但是同上面的一样依然没有\0,所以也是随机值。
printf("%d\n", strlen(*arr));//error
- 传给strlen函数的参数是一个地址,*arr表示首元素的值,即字符a 看成一个地址;
- 是 不能得到值的,所以这个输出是错误的 。
printf("%d\n", strlen(arr[1]));//error
- 第二个元素的值传给strlen 也是不能输出的,所以也是error。
printf("%d\n", strlen(&arr));//随机值
- 数组地址和首元素地址是同一位置相数的,同strlen(arr)一样也是随机值。
printf("%d\n", strlen(&arr+1));//随机值
- 跳过整个数组依旧是随机值。
printf("%d\n", strlen(&arr[0]+1));//随机值
- 首元素地址+1是第二个元素开始数,依旧是一个随机值。
char arr="abcdef";//字符串初始化
printf("%d\n", sizeof(arr));//7
- 把字符串放进去,则有字符串结束标志‘ \0 ’,所以输出为 7 。
printf("%d\n", sizeof(arr+0));//4
- 首元素地址+0还是首元素地址,输出为 4 。
printf("%d\n", sizeof(*arr));//1
- 首元素地址解引用为首元素,即一个字符,所以输出为 1 。
printf("%d\n", sizeof(arr[1]));//1
- 第二个元素的大小,输出为 1 。
printf("%d\n", sizeof(&arr));//4
- 整个数组的地址,输出为 4 。
printf("%d\n", sizeof(&arr+1));//4
- 跳过整个 数组的数组地址,输出为 4 。
printf("%d\n", sizeof(&arr[0]+1));//4
- 第二个元素的地址,输出为 4 。
printf("%d\n", strlen(arr));//6
- 整个数组的长度,字符串有结束标志,所以到 f 停下来,输出为 6 。
printf("%d\n", strlen(arr+0));//6
- 首元素地址,从首元素开始数即为 6 ;输出为 6 。
printf("%d\n", strlen(*arr));//error
- 把首元素传给 strlen ,是错误的。
printf("%d\n", strlen(arr[1]));//error
- 第二个元素传给 strlen ,是错误的。
printf("%d\n", strlen(&arr));//6
- 整个数组的地址传给strlen,即求出整个数组的大小,输出为 6 。
printf("%d\n", strlen(&arr+1));//随机值
- 跳过整个 数组,同时也跳过了 ‘ \0 ’,所以不能确定停在了哪里,所以输出为随机值。
printf("%d\n", strlen(&arr[0]+1));//5
- 从第二个元素开始数,即从 b 到 f ,所以长度为 5 。
char* p = "abcdef";//p是指针变量,字符指针
printf("%d\n", sizeof(p));//4
- p是指针变量,存放的是地址,即为4个字节,输出为 4 。
printf("%d\n", sizeof(p+1));//4
- 第二个元素的地址,输出为 4 。
printf("%d\n", sizeof(*p));//1
- 解引用为元素,字符大小为 1 。
printf("%d\n", sizeof(p[0]));//1
- p+[0] 解引用为首元素,大小为1 个字节。
printf("%d\n", sizeof(&p)); //4
- &p还是地址,输出为 4 。
printf("%d\n", sizeof(&p+1));//4
- 跳过p 的地址,地址大小还是 4 。
printf("%d\n", sizeof(&p[0]+1));//4
- p的地址+1还是地址,输出为 4。
printf("%d\n", strlen(p));//6
- p存的是a 的地址,从a 往后数,即到 \0 处停下来,所以输出为 6。
printf("%d\n", strlen(p+1));//5
- 字符指针+1跳过一个字符,所以从b 开始数,即输出为 5 。
printf("%d\n", strlen(*p));//err
- ’ * '解引用p为元素a ,a 传给 strlen 是错误的。
printf("%d\n", strlen(p[0]));//err
- a 传给 strlen 错误 。
printf("%d\n", strlen(&p));//随机值
p 是指针变量,&p是从p的地址往后数,不确定数到哪里,所以是随机值。
printf("%d\n", strlen(&p+1));//随机值
- 不确定数到哪里,所以也是随机值。
printf("%d\n", strlen(&p[0]+1));//5
- 从b 的地址往后数,即长度为 5 。
######二维数组
- sizeof ( arr[ 0 ] ) 为第一行的地址
- sizeof ( arr[ 0 ]+1 ); arr [ 0 ] 降级为第一行第一个元素的地址,所以该表达式表示第一行第二个元素的地址
- 二维数组的首元素为第一行;表达式sizeof ( arr +1)中,arr 降级为首元素地址,即第一行地址;加1则表示跳过第一行,即为第二行。