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 }
View Code

 

posted @ 2023-04-22 12:13  败人两字非傲即惰  阅读(25)  评论(0编辑  收藏  举报