int main()
{
int arr[5] = {1,2,3,4,5};
printf("&arr[0] = %p\n", &arr[0]);
printf("arr = %p\n", arr);
return 0;
}
可以发现打印内容是一样的,这是因为数组名隐式传递的是数组的第一个元素的地址,
即数组名为数组第一个元素的地址
这个时候则会想到我们经常用的sizeof(arr)了,既然arr是数组首元素的地址,那么sizeof(arr[0])/sizeof(arr)计算出来的值不就不是我们之前所理解的一个元素的大小了吗,其实分为以下两种情况
1. sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩,
在 C 和 C++ 中,数组名在大多数情况下会被隐式地转换为指向数组首元素的指针,但数组名本身并不是一个普通的指针变量。
如果写成int p = arr
,这是错误的做法,因为arr
代表的是一个地址(指向数组首元素的指针),而p
是一个普通的整数变量,不能用一个地址值直接赋值给一个整数变量。
而int *p = arr
是正确的,这里声明了一个指针变量p
,其类型是指向int
类型的指针,将数组首元素的地址(即arr
)赋值给这个指针变量是合理的,这样p
就指向了数组arr
的首元素。
通过以下printf和scanf中参数的区别的实验,更加理解了
在scanf(“”,参数)参数是我们输入的值要存入内存的位置也就是地址,然后arr本就是代表首元素的地址 加2后即是数组中第三个元素的地址,所以地址可以直接填入使用。
在printf(“”,参数)参数是我们要打印的变量,所以需要通过解引用操作即*(arr)来指向arr这个地址所代表所存的变量 *(arr+2)表示arr地址即首元素的地址加2后即为第三个元素的地址然后再解引用操作即指向了我们刚通过scanf存入数组的位于第三个元素位置的66.