回复 4楼 albertwzh
首先我更正一下你的一个错误,"s + 1"和"s++"的含义并不相同,前者的含义只是一个运算表达式,而后者等价于"s = s + 1"。
然后回答你的第一个问题(s + 1可以,而s++不行):如果s代表的是字符串的首字符的地址(即&s[0]),那么"s+1"这个表达式(注意是表达式)所代表的含义是字符串中第二个字符的地址(即&s[1])。而"s++"相当于"s = s + 1",导致内存泄露的问题(具体名称不清楚,原因是:存储't'字符的内存没有释放出来,但是却同样无法引用,很危险)。
接着,关于字符指针数组的问题。s是一个以为数组的名称,数组中元素是指向字符的指针元素(原因前面已说),或者换言之,s是一个二阶的指针。由此在按照你的代码给s初始以后,数组s中的元素赋值情况如下:s[0]指向字符t(s[0]存储字符t的地址),s[1]指向字符a(s[1]存储字符a的地址),s[2]指向字符'\n'(s[2]存储字符'\n'的地址)。
这里还有一个问题你必须搞清楚,关于运算符的优先等级,解引用符*的优先级比加法运算符+等级高,但是比自增运算符 ++ 的等级要低。所以*s++和*s+1的含义也不相同。++等级高于*,(假使可以的话),*s++的含义是a的地址(*s++等价于*(s++).s是数组的地址,++使s向后偏移一个元素指向原来s[1]的地址,*解引用符消除(这个词不专业,先这么说吧,方便理解)一次指针,即*s相当于一个一阶指针,指向一个地址,因为++已经使s偏移,s由指向原来的s[0]变为指向原来的s[1],所以*s指向a的地址)。而*s+1不然,*s+1相当于(*s) + 1(*优先等级高于+),*s指向t的地址,所以*s+1含义是指向e的地址(注意这里是*s+1,而不是*(s+1))。
以上这些原因造成与你预期结果不同的输出。
至于你的最后一个问题答案是肯定的,但是注意不应该使用一个作为存储字符串的指针来实现,可以另外声明一个新的指针来实现。例如:
char *s = "Please test this program.\n", *p = s;
while(*p) {
//语句
}
通过检测指针p所指向的字符是否为'\0'来实现循环(若p指向'\0',*p的值为0,循环结束),for语句中以此类推,作为表达式2即可。
有一些建议:
你的基础概念不扎实,应该多看看书,多看一些正确的程序,多理解理解。如果你不把基础概念理解透光听我这样讲解你只会感到头晕,混淆你以前所学的知识。
祝你好运。