C++ 指针找茬

1.

下面的代码中编译器会报一个错误,你知道是哪个语句错了吗?

typedef char * pStr;

char string[4] = "abc";

const char *p1 = string;

const pStr p2 = string;

p1++;

p2++;

  是p2++出错了。这个问题再一次提醒我们:typedef和#define不同,它不是简单的文本替换。上述代码中const pStr p2并不等于const char * p2。const pStr p2和

const long x本质上没有区别,都是对变量进行只读限制,只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已。因此,const pStr p2的含义是:限定数

据类型为char *的变量p2为只读,因此p2++错误。

  解释:const char *p1 = string; 你可以这样理解:(const char) *p1 = string, p1是一个指针,指向const char的东西,这个东西就是string(string是一个字符数组的首地址,它的地址声明后肯定是const的,除非该数组销毁),但是p1是一个 指针变量,它是可以递增的,即你看到的p1++,它可以完成从数组的来遍历数组的目的。

  而const pStr p2 = string;是这样的:由于p2不是指针,const直接修饰到了p2,即现在的p2是常量了(所以p2++就出错了,因为常量不能改),它的类型是pStr(我们自己定义的类型),相当于 const int p2, const long p2等等,const都是直接修饰p2的,只不过int,long是系统类型,而pStr是我们定义的类型。为什么会出现这种效果了,就是因为 typedef,它把char *定义成一个复合的类型,要从整体上来理解语义,而不是字符替换后来理解语义

Feedback

#1楼  回复 引用 查看   

2011-10-21 16:24 by  寻找一片天空       
"string是一个字符数组的首地址,它的地址声明后肯定是const的,除非该数组销毁"
该语句感觉有误.....
什么叫"它的地址声明后肯定是const的",完全可以如下定义:
char string[4] = "abc";
char *p1 = string;

#2楼[楼主]  回复 引用 查看   

2011-10-21 21:30 by  mooner++       
@寻找一片天空
不好意思,是我没表述清楚。
“string是一个字符数组的首地址,它的地址声明后肯定是const的,除非该数组销毁”是说那个地址在变量初始化时分配好了,地址是不变的

#3楼  回复 引用 查看   

2011-10-21 23:18 by  寻找一片天空       
@mooner++
你这种说法更混了....
string严格来说是数组,只是在某种情况下,可隐式转化为指针,实质还是一个数组.....
任何对象都跟int a类似,在内存里分配了空间,对象的地址在定义到最后肯定是不变的,此处的string也类似,string在内存的地址一样是不变的,所以你不用强调“个地址在变量初始化时分配好了,地址是不变的”,任何对象在分配时,地址就固定了...
不知是我理解有误还是楼主表达有误.....我想表达的是string的地址跟const与非const无任何联系...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值