指针与数组的区别

在C/C++中,指针与数组在很多情况下是可以相互替换的,所以很容易让人产生一种错觉,认为二者是等价的,而实际上并非如此。

数组名对应着(注意不是指向)一块内存,每创建一个数组,就需要为其分配相应的内存,且其地址与容量在其生命周期内不可变,可以改变的是其内容(“地址不可变,内容可变”这一点跟指针常量很像,但依然不是指针)。

指针指向一块内存,但这块内存并不是因为这个指针分配的,只是这个指针刚好指向它而以,这个指针可以随时指向别的内存。

char a1[] = "hello";
char a2[] = "hello";
char *p1 = "hello";
char *p2 = "hello";
cout << "a1:" << (void*)a1 << endl;  // 0012FD78
cout << "a2:" << (void*)a2 << endl;  // 0012FD68
cout << "p1:" << (void*)p1 << endl;  // 0044DD74
cout << "p2:" << (void*)p2 << endl;  // 0044DD74

a1和a2是两个数组,系统为它们分别分配了内存(0012FD7、0012FD68),然后用“hello”进行初始化,所以它们分别对应着两块不同的内存。char a1[] = "hello" 实际上等价于如下代码:

char a1[] = {'h','e','l','l','o','\0'};

p1和p2是两个指针,它们都指向同一块内存(0044DD74),这块内存是为常量字符串“hello”分配的。

由于p1和p2指向的是常量字符串,所以对其内容进行修改是非法的,但可以使其指向别的内存:

p1[0] = 'H';     // compiler不能发现该错误,但运行时会发生runtime error
p1 = "Hello";    // ok,p1指向常量字符串“Hello”所对应的内存

但对于数组a1和a2,它们的内容是可变的,但不能改变其地址:

a1[0] = 'H';     // ok
a1 = a2;         // error, a1不能作为左值


指针和数组的别一个区别是sizeof运算符,sizeof作用于数组,结果是该数组所对应的内存的大小,sizeof作用于指针,结果是指针变量所占内存的大小:

cout << sizeof(a1) ;     // 6
cout << sizeof(p1);      // 4


需要特别注意的是,当数组作为函数参数时,会自动退化为同类型的指针。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值