2.8 数组作为参数
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提供了这个非常聪明的例子)。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。
时间: 2024-09-20 17:48:10