本节书摘来自异步社区出版社《C和C++代码精粹》一书中的第2章,第2.15节,作者: 【美】Chuck Allison,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.15 小结
C和C++代码精粹
C和C++仅仅与那些使用它们的人一样危险。
指针是地址。
可以将任何一个指针赋值成void*。
注意区分一个const指针和一个指向const的指针。
p±n = =(char)p±n sizeof (*p)。
p-q = = ±n 。
*(a+i) = = a [i]。
除非在sizeof和&的上下文中,否则一个数组名即是指向它第一个元素的指针。
没有多维数组,只有数组的数组。
仅是指针的存在并不要求它所引用的类型的实现的有效性(这是一个不完全类型)。
如果理解了这些概念,你就正在逐渐地成为一名可信赖的C++程序员。现在去告诉你的老板,她可以指派你去编写真正的程序。
练习答案
练习2.1
已知如下声明:
int a[ ] = { 10, 15, 4, 25, 3, -4 };
int *p = &a[ 2 ];
下面表达式的结果是什么?
a. *(p+1) 25
b. p[-1] 15
c. p-a 2
d. a[*p++ ] 3
e. *(a+a[ 2 ]) 3
练习2.2
下面的语句通过一系列指针表达式修改字符串s,当顺序执行时每个表达式重新得到什么字符,最后的结果是什么?
char s[ ] = "desolate",*p = s;
*p++ = = d;
*(p++)= = e;
(*p)++= = s;
*++p = = o;
*(++p)= = l;
++*p = = m;
++(*p )= = n;
strcmp(s,"detonate") = = 0;
练习2.3
其中十六进制值是相对于a地址偏移量。
0x0f0 = = 240
0x140 = = 320
0x154 = = 340
0x158 = = 344
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。