c 数组名和指针的区别
关于c中 数组名和指针的区别 我写了一下程序进行测试并就自己的理解做了详细的解释,供自己以后复习,大佬批评指正和需要的网友参考学习。
环境:gcc(mingw或cygwin)
代码:
1 #include<stdlib.h> 2 int main(int argc, char const *argv[]) 3 { 4 int arr[10]={23456,3,4,5,6,7,8,9,0,1}; 5 int* p4=arr; 6 int* p5=&arr; 7 int* p6=&arr[0]; 8 printf("&arr数组名指针常量(常量指针)本身的地址:%p(%%p:16进制,专业打印地址)\n",&arr); 9 printf("&arr数组名指针常量(常量指针)本身的地址:%x(%%x:16进制)\n",&arr); 10 printf("&arr数组名指针常量(常量指针)本身的地址:%d(%%d:10进制,我懒得改下面干脆都用十进制好了)\n",&arr); 11 printf("sizeof(&arr)数组名指针常量(常量指针)的地址的大小(其实一个开发环境下地址的大小都是一样的):%d字节\n",sizeof(&arr)); 12 printf("----------\n"); 13 printf("arr数组名指针常量(常量指针)的值(即该常量指针所指的地址):%d\n",arr); 14 printf("可以看到数组名常量指针(常量指针)本身的地址与其所指(被赋给指针的)的地址是一样的,即数组名常量指针指向自己所在的地址,也就是说一个数据结构用了一个指针常量(这种指针常量有点特殊,虽然它存的是地址,但大小和一般的指针变量不同,它的大小是这块数据结构所申请的内存大小)存了该指针常量自己所在的地址。我不知道为什么要这样做\n"); 15 printf("sizeof(arr)数组名常量指针(常量指针)的数据结构(即该常量指针所指的地址存放的变量申请的内存)的大小:%d字节\n",sizeof(arr)); 16 printf("sizeof(*arr)数组名常量指针(常量指针)的所指的数据结构的首元素的大小:%d字节\n",sizeof(*arr)); 17 printf("----------\n"); 18 printf("&p4数组名赋给的指针变量的地址:%d\n",&p4); 19 printf("sizeof(p4)数组名赋给的指针变量存放的地址的大小:%d字节\n",sizeof(p4)); 20 printf("p4数组名赋给的指针变量的值:%d(指针变量不加*表示引用赋给它的地址)\n",p4); 21 printf("*p4数组名赋给的指针变量所指的变量的值:%d(指针变量加*表示引用赋给它的地址的值)\n",*p4); 22 printf("sizeof(*p4)数组名赋给的指针变量所指的变量的类型的大小:%d字节\n",sizeof(*p4)); 23 printf("直接传数组名arr----------\n"); 24 show_parasize1(arr,sizeof(arr)); 25 show_parasize2(arr,sizeof(arr)); 26 printf("传数组的首地址&arr----------\n"); 27 show_parasize1(&arr,sizeof(arr)); 28 show_parasize2(&arr,sizeof(arr)); 29 printf("测试结果是:数组名arr作为参数时,和它的地址&arr(或&arr[0]或&*arr)没区别\n"); 30 printf("----------\n"); 31 printf("传数组名的值&*arr,即&arr[0]----------\n"); 32 show_parasize1(&*arr,sizeof(arr)); 33 show_parasize2(&*arr,sizeof(arr)); 34 printf("传数组名的值*arr,即arr[0]型参实参类型不匹配会出错,但是不影响上面代码运行----------\n"); 35 show_parasize1(*arr,sizeof(arr)); 36 show_parasize2(*arr,sizeof(arr)); 37 } 38 show_parasize1(int*arr,int size){ 39 printf("(int*arr)\n"); 40 printf("sizeof(arr):%d //因为数组名作为参数数传递是不能传真正的数组名的,只能传它的指针过去,这时sizof(arr)就不是数组的大小40字节了指针的大小8Byte\n",sizeof(arr)); 41 printf("sizeof(*arr):%d //*arr表示a[0],a[0]是int型,大小是4字节\n",sizeof(*arr)); 42 printf("sizeof(&arr):%d //数组名作为参数数传递后数组名arr和它的地址&arr的含义就没有区别了\n",sizeof(&arr)); 43 for(int i=0; 44 i<size/sizeof(arr[0]); 45 printf("%d ",*(arr+i)), 46 i++); 47 printf("\n"); 48 } 49 show_parasize2(int arr[],int size){ 50 printf("(int arr[])\n"); 51 printf("sizeof(arr):%d //因为数组名作为参数数传递是不能传真正的数组名的,只能传它的指针过去,这时sizof(arr)就不是数组的大小40字节了指针的大小8Byte\n",sizeof(arr)); 52 printf("sizeof(&arr):%d //数组名作为参数数传递后数组名arr和它的地址&arr的含义就没有区别了\n",sizeof(&arr)); 53 printf("sizeof(*arr):%d //*arr表示a[0],a[0]是int型,大小是4字节\n",sizeof(*arr)); 54 for(int i=0; 55 i<size/sizeof(arr[0]); 56 printf("%d ",*(arr+i)), 57 i++); 58 printf("\n"); 59 }