本节书摘来自异步社区出版社《C和C++代码精粹》一书中的第2章,第2.15节,作者: 【美】Chuck Allison,更多章节内容可以访问云栖社区“异步社区”公众号查看。
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本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。
相关资源:C和C 代码精粹