C语言的指针递增与解引用*
原网址:http://www.cclove.me/6feb700c6cd73685a8b3fb930e289d6b.html
看到某群里面有人说:
夏式 2011-8-13 15:24:47char *strcat(char *s1,const char *s2){ char *p; p = s1; while(*p++); while(*p++ = *s2++); return s1;}夏式 2011-8-13 15:24:52何其蛋疼的指针。。。
然后我就乐了,想到可爱的夏式那蛋疼的样子就想笑。于是我想起了以前的日志,重新发一遍好了。o(∩∩)o...哈哈~~
&ch 得到ch的地址
cp 储存着ch的地址,即ch的指针
&cp 得到cp指针的地址,即指针的指针
*cp 对cp解引用,得到cp指向的内存位置的值
*cp+1 对cp解引用,得到cp指向的内存位置的值,把值加一
*(cp+1) 把cp+1,指向下一个内存地址,然后对它解引用
++cp 把cp+1然后返回指针的拷贝
cp++ 返回指针的拷贝然后把cp+1
*++cp 先cp+1,指向下一个内存地址,然后对它解引用
*cp++ ++操作符产生cp的一份拷贝,然后++操作符增加cp的值,然后在cp的拷贝上对它解引用(++操作符的优先级高于*操作符)
++*cp 由于这两个操作符的结合性都是从右向左,所以首先对它解引用,然后cp所指的位置的值+1
(*cp)++ 首先解引用,然后增值原先值
++*++cp 从右到左,先增加指针的值,再解引用,再增加指针指向的值。
++*cp++ 这个表达式和前一个表达式的区别在于这次第一个++操作符是后缀形式而不是前缀形式。由于它的优先级比较高,所以先执行它。间接访问操作所访问的是cp所指向的位置而不是cp所指向位置后面的那个值。
*p++先解引用再递增指针指向下一个内存地址。
main(){ char a[] = "abcdefghijk"; char *b = a; while(*b != 0) printf("%c", *b++);}
打印abcdefghijk。直接
*a++则出错。