代码演示
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char* argv[])
{
long long arr[5] = {1,2,3,4,5}; //数组
long long* arrPoint = arr; //指向数组的指针
//
printf("%d\n",sizeof(long long)); //long long 长度为8
printf("arrPoint pointer: %p\n",arrPoint); //arrPoint pointer:0061FEF8
//
printf("&arr[0] pointer: %p\n",&arr[0]); //&arr[0] pointer:0061FEF8
printf("arr pointer: %p\n",arr); //arr pointer:0061FEF8
printf("&arr[0] size: %d\n",sizeof(&arr[0])); //&arr[0] size:4
printf("arr size: %d\n",sizeof(arr)); //arr size:40
//
printf("arrPoint pointer: %p\n",&arrPoint[0]); //arrPoint pointer:0061FEF8
printf("arrPoint pointer: %p\n",arrPoint); //arrPoint pointer:0061FEF8
printf("&arrPoint[0] size: %d\n",sizeof(&arrPoint[0]));//&arrPoint[0] size:4
printf("arrPoint size: %d\n",sizeof(arrPoint)); //arrPoint size:4
//
printf("&arr pointer: %p\n",&arr); //&arr pointer 0061FEF8
printf("&arr+1 pointer: %p\n",&arr+1); //&arr+1 pointer 0061FF20(0061FEF8+0x28(40))
printf("arr pointer: %p\n",arr); //arr pointer 0061FEF8
printf("arr+1 pointer: %p\n",arr+1); //arr+1 pointer 0061FF00(0061FEF8+0x8)
//
printf("&arrPoint pointer: %p\n",&arrPoint); //&arrPoint pointer 0061FEF4
printf("&arrPoint+1 pointer: %p\n",&arrPoint+1); //&arrPoint+1 pointer 0061FEF8(0061FEF4+0x4)
printf("arrPoint pointer: %p\n",arrPoint); //arrPoint pointer 0061FEF8
printf("arrPoint+1 pointer: %p\n",arrPoint+1); //arrPoint+1 pointer 0061FF00(0061FEF8+0x8)
//
printf("arr value: %d\n",*(arr)); //arr value 1
printf("arr+1 value: %d\n",*(arr+1)); //arr+1 value 2
//
printf("arrPoint value: %d\n",*(arrPoint)); //arrPoint value 1
printf("arrPoint+1 value: %d\n",*(arrPoint+1)); //arrPoint+1 value 2
return 0;
}
代码分析
-
特性1(数据结构区别)
- arr
数组名,对应的是一种数据结构,而这种结构叫数组。 - arrPoint
指向数组的指针,对应的数据结构是指针。
- arr
-
特性2(大小)
由于数组和指针是不一样的数据结构, sizeof 求对应数据结构的大小,因此
- sizeof (arr) 是数组的大小,在上述代码中为 40 字节;
- sizeof (arrPoint) 是指针的大小,在上述代码中为 4 字节(32位编译器);
-
特性3(数组名指向地址)
- 指向数组的指针 arrPoint 、数组名 arr,数组首部元素的地址 &arr[0],指向是同一个地址,因此在某些程度上,数组名和指针是相似的;
-
特性4(相似性)
- 数组名+1:arr+1、指向数组的指针+1: arrPoint+1,指向的地址是一致的,此处也证明了数组名和指针是相似的;
-
特性5(取地址+1的效果)
- 数组名取地址+1: &arr+1、指向数组的指针+1: &arrPoint+1,效果是不一致的,前者增加了 40 个字节(数组的大小),后者增加了 4 个字节,侧面证明数组名与指针是不完全一样的;
总结
数组名 和 指向数组的指针在一定程度上有 相似性,但其并 不完全等同。