《C和C++代码精粹》——2.8 数组作为参数

简介:

本节书摘来自异步社区出版社《C和C++代码精粹》一书中的第2章,第2.8节,作者: 【美】Chuck Allison,更多章节内容可以访问云栖社区“异步社区”公众号查看。

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提供了这个非常聪明的例子)。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关文章
|
5天前
|
C语言 C++ 开发者
深入探索C++:特性、代码实践及流程图解析
深入探索C++:特性、代码实践及流程图解析
|
28天前
|
IDE Java Linux
【CMake】CMake构建C++代码(一)
【CMake】CMake构建C++代码(一)
|
28天前
|
C++ 计算机视觉 Windows
【C++】由于找不到xxx.dll,无法继续执行代码,重新安装程序可能会解决此问题。(解决办法)
【C++】由于找不到xxx.dll,无法继续执行代码,重新安装程序可能会解决此问题。(解决办法)
|
1天前
|
编译器 C语言 C++
【C++入门学习指南】:函数重载提升代码清晰度与灵活性
【C++入门学习指南】:函数重载提升代码清晰度与灵活性
9 0
|
2天前
|
存储 C++
【C++模板】模板实现通用的数组
【C++模板】模板实现通用的数组
|
5天前
|
设计模式 编译器 数据安全/隐私保护
C++ 多级继承与多重继承:代码组织与灵活性的平衡
C++的多级和多重继承允许类从多个基类继承,促进代码重用和组织。优点包括代码效率和灵活性,但复杂性、菱形继承问题(导致命名冲突和歧义)以及对基类修改的脆弱性是潜在缺点。建议使用接口继承或组合来避免菱形继承。访问控制规则遵循公有、私有和受保护继承的原则。在使用这些继承形式时,需谨慎权衡优缺点。
16 1
|
6天前
|
设计模式 存储 Java
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
|
6天前
|
编译器 程序员 C++
C++从入门到精通:3.1模板编程——提高代码的复用性和灵活性
C++从入门到精通:3.1模板编程——提高代码的复用性和灵活性
|
7天前
|
存储 人工智能 C++
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
26 1
|
7天前
|
C++
【C++】在使用代码组装URL时,一定要注意的坑......
【C++】在使用代码组装URL时,一定要注意的坑......
10 0