本节书摘来自异步社区出版社《C和C++代码精粹》一书中的第2章,第2.8节,作者: 【美】Chuck Allison,更多章节内容可以访问云栖社区“异步社区”公众号查看。
C和C++代码精粹当你把数组作为参数传递给一个函数,正如所预期的那样,是传递了指向数组第一个元素的指针。因此,可以在调用的函数中永久地改变数组元素的值。在程序清单2.12的函数f中,地址&a[0]按值传递给指针b,因此表达式b[i]就和表达式a[i]完全是一样的了。不可能按值传一个完整的内置数组。
即使用数组符号定义了参数b,即:
int b[]它同下面这种写法是完全一样的。
int *b程序清单2.12 说明作为参数的数组实际上是指针
// array5.cpp: 数组作为参数 #include <iostream> using namespace std; void f(int b[], size_t n) { cout << "\n*** Entering function f() ***\n"; cout << "b == " << b << endl; cout << "sizeof b == " << sizeof b << endl; for (int i = 0; i < n; ++i) cout << b[i] << ' '; b[2] = 99; cout << "\n*** Leaving function f() ***\n\n; } main() { int a[] = {0,1,2,3,4}; size_t n = sizeof a / sizeof a[0]; cout << "a == " << a << endl; cout << "sizeof a == " << sizeof a << endl; f(a,n); for (int i = 0; i < n; ++i) cout << a[i] << ' '; } //输出: a == 0x0012ff78 sizeof a == 20 *** Entering function f() *** b == 0x0012ff78 sizeof b == 4 0 1 2 3 4 *** Leaving function f() *** 0 1 99 3 4而且,sizeof(b)==4,这是我的操作平台上指针的大小。我们无法在另一个函数中自动地决定一个数组编译时的大小。
指向数组元素的指针参数在文本处理中非常普遍。函数(str_cpy)就可以把一个字符串拷贝到另一个字符串中(除了无返回值外,它与strcpy一样):
void str_cpy(char *s1,const char *s2) { while (*s1++ =*s2++); }while循环测试不是为了检测值相等,而是检测在赋值后(但是在自增之前)s1的值,循环在拷贝了结束符号‘0’后停止,表达式*p++是一个很常用的C/C++习惯方式。
习题 2.2
下面的语句通过一系列指针表达式修改字符串s,当顺序执行时每个表达式重新得到的是什么字符,最后的结果是什么?
char s[ ] = “ desolate”,*p = s; *p++ = = ? *(p++)= = ? (*p)++= = ? *++p = = ? *(++p)= =? ++*p = = ? ++(*p)= =? Strcmp(s,? ) = =0(感谢Lincoln实验室的Chet Small提供了这个非常聪明的例子)。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。
相关资源:七夕情人节表白HTML源码(两款)