【C++】有关c++中数组与指针的关系


下图是代码与运行结果:
1.简单数组与指针的关系(int型数组为例):

解释: 第二句相当于int型指针cp指向了数组的第一个元素,所以,打印出的cp是第一个元素的地址;&cp[0]与cp等价;&cp也仍然是个地址;*cp通过解引用得到了数组的第一个元素;只要指针指向的是数组中的元素(或者数组中尾元素的下一位置),都可以执行下标运算,cp[0]等价于*(cp+0),故为数组的第一个元素。
总结:在很多情况下,使用数组的名字其实用的是一个指向数组首元素的指针,一个典型的例子是当对数组使用下标运算时编译器会自动执行上述转换操作。对数组执行下标运算实际上是对指向数组元素的指针执行下标运算。例如:int i=inum[2]//inum则转换成指向数组首元素的指针,inum[2]得到(inum+2)所指的元素。

2.char型数组与指针的关系:

解释:前面一段中,cp被定义为指向“Hello World”的char型指针,“Hello World”是string类型,显然与char型不相吻合,可认为编译器做了以下事情:在常量区分配4个字节,分别放上H,e....d,\0这些字符,然后把H的地址返回给cp。(字符串放在了常量区,是不可修改的,试图修改,运行异常。为了兼容才允许这样写,最好写const char *cp="Hello World",这样的话,试图修改cp的内容时,编译时就会报错。)
后面一段char str[]={"Hello World"},相当于在栈顶分配了12个字节,分别放上H,e....d,\0这些字符,等价于char str[]={'H','e'....'d','\0'},但长度不包括\0。按道理cp0应该是输出的首元素的地址,等价于&cp0[0],但实际却输出整个字符串,这是由cout决定的,若要输出地址,则使用int强制转化为地址即可,即cout<<(int)cp0<<endl;。

3.指针单独演示:

数组和指针的区别:
(1)数组对应着一块内存区域,而指针是指向一块内存区域。
(2)用sizeof可以计算数组的容量(字节数),而无法计算指针所指内存的容量,用sizeof(p)得到的结果永远是4或者2(即指针变量所占内存单元的字节数)

4.指针和多维数组
当程序使用多维数组的名字时,也会自动将其转换成指向数组首元素的指针。因为多维数组实际上是数组的数组,所以由多维数组名转换得来的指针实际上是指向第一个内层数组的指针。
int ia[3][4];
int (*p)[4]=ia;//p指向含有四个整数的数组

for (int(*p)[4] = ia; p != ia + 3; p++)
for (int *q = *p; q != *p + 4; q++)
cout << *q; //遍历输出ia的元素

以上*p是一个指针,其与ia的值相等。



  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值