前言
考察对数组名、指针运算、指针类型的理解。
数组名的意义:
- sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
- &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
- 除此之外所有的数组名都表示首元素的地址。
1. 一维数组
代码语言:javascript复制#include <stdio.h>
int main() {
//一维数组
int a[] = { 1,2,3,4 };
int i = 1;
printf("%-2d -- %dn", i , sizeof(a));
//数组名a单独出现在sizeof内部,表示整个数组,求出的是整个数组的大小 -- 16
printf("%-2d -- %dn", i , sizeof(a 0));
//数组名a没有单独出现,表示的是数组首元素的地址,大小为 -- 4(或8)
printf("%-2d -- %dn", i , sizeof(*a));
//a是数组名,表示数组首元素的地址,即&a[0],解引用*之后就是数组首元素a[0],大小是 -- 4
printf("%-2d -- %dn", i , sizeof(a 1));
// a是数组名,表示数组首元素的地址, 1表示跳过一个int元素,
//(a 1)表示a[1]的地址,大小是-- 4(或8)
printf("%-2d -- %dn", i , sizeof(a[1]));
//数组首元素,大小为 -- 4
printf("%-2d -- %dn", i , sizeof(&a));
//a是数组名,&a表示取出了整个数组的地址,类型是数组指针,大小为 -- 4(或8)
printf("%-2d -- %dn", i , sizeof(*&a));
// a是数组名,& a表示取出了整个数组的地址,类型是数组指针。
// *解引用表示找到了整个数组,所以计算的是整个数组的大小-- 16
printf("%-2d -- %dn", i , sizeof(&a 1));
// a是数组名,& a表示取出了整个数组的地址,类型是数组指针。
// 数组指针 1将跳过整个数组的大小,指向下一个数组,仍然是指针 大小 -- 4(或8)
printf("%-2d -- %dn", i , sizeof(&a[0]));
//是a[0]的地址,大小 -- 4(或8)
printf("%-2d -- %dn", i , sizeof(&a[0] 1));
//是a[1]的地址,大小 -- 4(或8)
return 0;
}
运行结果:
2. 字符数组
代码语言:javascript复制#include <stdio.h>
int main() {
//字符数组
char arr[] = { 'a','b','c','d','e','f' };
printf("%dn", sizeof(arr));
//arr是数组名,单独出现在sizeof内部,表示整个数组,计算的是整个数组的大小 -- 6
printf("%dn", sizeof(arr 0));
//arr是数组名,表示首元素的地址, 0表示跳过0个元素,仍然是首元素的地址 -- 4(或8)
printf("%dn", sizeof(*arr));
//arr是数组名,表示首元素的地址,*解引用之后表示首元素arr[0],大小 -- 1
printf("%dn", sizeof(arr[1]));
//数组元素arr[1]的大小 -- 1
printf("%dn", sizeof(&arr));
//&arr表示取到了整个数组的地址,本质上是数组指针(char (*)[6]), 大小 -- 4(或8)
printf("%dn", sizeof(&arr 1));
//&arr表示取到了整个数组的地址, 1后将跳过整个数组的大小,
//得到的新地址是另一个数组的地址。 大小 -- 4(或8)
printf("%dn", sizeof(&arr[0] 1));
//&arr[0]得到数组元素arr[0]的地址, 1后得到数组元素arr[1]的地址。大小 -- 4(或8)
//---------------------------------------------------------
printf("%dn", strlen(arr));
//strlen()函数计算的是字符串,'