c和cpp中的那些不同(指针和数组)

本文对比了C/C++中数组与指针的关键差异,包括sizeof运算符的应用、类型本质的不同以及可变性等方面,揭示了两者在内存布局及使用方式上的本质区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在C/C++的学习中,经常能碰到因为C++为了兼容C语法而产生的一些不同。
或者说是语言上一些看起来相似的特性但是作用不完全相同或者完全不同的特性。
为了做到把书越读越薄,有必要做一个整理,把这两个相爱相杀的一些坑点列举出来。
因为也有不少大神关于这些问题做出了详细解释,所以我只写出关键的易于区分的特点
,更多细节还是得要多看书。

①指针和数组的区别

先来一段代码

char array[]="i am the array";//15个字节(包括结束符)
char* pointer = arraycout<<sizeof(array)<<endl;//输出:15
cout<<sizeof(pointer)<<endl;//输出:32位编译输出:4,64位编译输出:8

第一个区别:sizeof关键字运算得到的结果不同
1.sizeof关键字,作用在数组上得到的数组的整体字节大小。作用在指针上得到的是一个指针类型的字节数4,当使用64位编译时输出指针类型的大小是8字节。

第二个区别:两者的类型完全不是一回事
1.从上面的sizeof可以初步得到结论。指针变量是一个可以存放变量地址的实体,它有自己的地址,可以存放(指向)别人的地址。
2.数组指代着内存中一块连续区域,该连续区域的起始地址的可以用过一个名字来寻址,要注意的是数组名并非一个存放了数组首地址的变量,而是数组名就代表着数组的首地址,只不过编译器给了该地址一个符号名。

第三个区别:可变性
1.经过编译,编译器给数组分配好空间后,通过数组名就和一个唯一的地址绑定在一起了,不能通过数组名做出指针一样的指向操作,因为数组名自己就是一个地址的符号而已,给一个地址覆盖另一个地址显然是有问题的。数组是静态的。
2.指针可以不要求定义后,立即指向一个内存地址,可以在其生存期内任何时刻做出指向的操作,指向不同的内存地址。
3.数组不存在指向这一说法。这个要注意

最后:有一点要指出的是,数组无论是创建在静态存储区还是栈区,或者是堆区。在创建好后,数组的大小都是固定的了,是静态的。在堆上的创建的数组唯一的区别是编译器并不会给其分配一个符号名,所以操作堆上数组时需要通过一个指针变量来保存堆上数组的首地址。然后通过这个指针去使用数组,但需要注意存放堆数组的指针只能找到堆数组的首元素。
如下面

char* p = new char[20];
char* d = "hello world";
strcpy(p,d);
cout<<*p<<endl;//输出‘h’
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值