首页 > 其他分享 >c 数组名和指针的区别

c 数组名和指针的区别

时间:2023-04-22 12:22:51浏览次数:37  
标签:arr 常量 区别 数组名 printf sizeof 指针

关于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);
26     printf("传数组的首地址&arr----------\n");
27     show_parasize1(&arr,sizeof(arr));
28     show_parasize2(&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);
34     printf("传数组名的值*arr,即arr[0]型参实参类型不匹配会出错,但是不影响上面代码运行----------\n");
35     show_parasize1(*arr,sizeof(arr));
36     show_parasize2(*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[]){
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     printf("\n");
55 }

 

标签:arr,常量,区别,数组名,printf,sizeof,指针
From: https://www.cnblogs.com/xuweihui/p/17342743.html

相关文章

  • Math.ceil,Math.round,Math.floor区别
    Math.ceil,Math.round,Math.floor区别//向上取整System.out.println("amt1="+Math.ceil(71.01));//四舍五入System.out.println("amt2="+Math.round(71.01));//向下取值,直接舍弃小数点System.out.println("amt3=......
  • left join 和 where 区别
    RThttps://leetcode.cn/problems/replace-employee-id-with-the-unique-identifier/solution/selectb.unique_id,a.namefromEmployeesaleftjoinEmployeeUNIbona.id=b.id;selectb.unique_id,a.namefromEmployeesa,EmployeeUNIbwherea.id=b.id;whe......
  • AntdPro中formItemProps和fieldProps的区别
    title:AntdPro中formItemProps和fieldProps的区别date:2023-04-1312:50:23tags:["React","AntDesign"]categories:["前端篇"]最近在工作中接触到了antd和antdpro,作为一个react和antd新人,在学习和使用中遇到了不少的问题,下边就常见的一个问题来进行记录,后......
  • 18650 和 14500 电池的区别
    摘录文章《14500电池可以使用18650电池替代吗?》转载自:hsldc88.com/xinwen-2/153.html运用一样额定值电流的18650是可以代替14500电池运用的,并且也不用变更原先的电路。但是拆卸要考虑到2个问题,一个是安裝难题,因为18650比14500电池的容量大,要考虑到原来的拼装位置能否学会放弃;第......
  • 双指针总结
    双指针总结快慢指针类似于龟兔赛跑,两个链表上的指针从同一节点出发,其中一个指针前进速度是另一个指针的两倍。利用快慢指针可以用来解决某些算法问题,比如计算链表的中点:快慢指针从头节点出发,每轮迭代中,快指针向前移动两个节点,慢指针向前移动一个节点,最终当快指针到达终点的时......
  • throws和try、catch有什么区别?throws如何使用?
    在Java中,异常处理是非常重要的一部分。当程序出现异常时,我们需要对其进行处理以确保程序的正确性和可靠性。Java提供了两种异常处理机制:throws和try、catch。区别throws和try-catch都是用于异常处理的机制,但它们应用场景不同。throws关键字用在方法声明后面,表示该方法有可能会......
  • bs与cs模式-java、ipBS架构和CS架构的区别
    http://m.d3zww.com/s.php 书库BS架构和CS架构的区别https://ding-doc.dingtalk.com/ 钉钉文档https://oa.dingtalk.com/ 钉钉-办公https://gitee.com/hcking/ gitee主页 https://shiniest.cn/ 博客https://weibo.com/hongchen5211314 微博主页支付接口创建订单号 ......
  • C++——string 成员函数 length(),size() 和 C strlen() 的区别
    //方法一:调用length()或size()stringstrTest="test";strTest.length();//4strTest.size();//4//方法二:转为C风格字符串,调用strlen()strlen(strTest.c_str());//4注意:当string中含有空字符’\0’,使用 strlen()获取stri......
  • python脚本打包与请求带session的区别
    pyinstaller-F-iD:\ico\123.icoXXX.py--key123456如何防止exe被反编译呢只需在打包命令后面加上--key命令即可,例如文章开头的命令可以更换为:pyinstaller-Fw--icon=h.icoauto_organize_gui.py--add-data="h.ico;/"--key123456123456是你用来加密的密钥,可以随......
  • 最高法-代位执行申请的条件系次债务人和债务人之间的债务数额到期且确定(区别于代位权
    (2015)执复字第15号  保定同为电气设备有限公司、中国银行股份有限公司保定分行与保定天威集团有限公司、保定天威薄膜光伏有限公司金融借款合同纠纷、申请承认与执行法院判决、仲裁裁决案件执行裁定书本院认为:本院对河北高院查明的事实予以确认。本院认为:本案的焦点问题是诉讼......