本文共 2115 字,大约阅读时间需要 7 分钟。
在 C++ 中,数组和指针概念密切相关。以下几点需要注意:
数组与指针的等价性:
在函数头或原型参数中,int arr[]
等价于 int *arr
。这意味着数组名可以被视为指针,且数组名解释为第一个元素的地址。 数组元素访问:
arr[i]
等价于 *(arr + i)
,这表明数组是按值访问的。 数组地址与指针:
&arr[i]
等价于 arr + i
。当以数组形式传递或以指针形式传递时,可以节省复制和拷贝的时间及空间开销。 优缺点对比:
数组大小传递:
为了明确传递数组的大小,建议使用两个参数:void filer(int arr[], int size)
比 void file(int arr[size])
更优。 const
关键字在指针中有两种主要用法:
指针指向常量:
当指针指向一个常量时,防止该指针修改所指向的值。例如:const int age = 30; const int * pt = &age;
此时,pt
可以指向 age
,但不能修改 age
的值。
指针本身声明为常量:
指针声明为const
时,防止指针指向的值发生变化。例如: int sloth = 3; const int * ps = &sloth; // 指针指向常量 int * const finger = &sloth; // 常数指针,指向整数
这两种声明方式都能避免不经意修改数据所引发的错误。
二维数组的声明方式有多种:
使用大小和元素类型:
int (*arr)[4]; // 可变大小,指向数组的指针 int arr[4][3]; // 固定大小的二维数组
或者使用隐含大小:
int data[3][4] = { {1, 2, 3, 4}, {9, 8, 7, 6}, {2, 4, 6, 8} };
二维数组的访问:
arr[r][c]
访问第 r
行第 c
列的元素。* (arr + r) + c
或 *(arr[r][c])
也可实现相同效果。C++ 中,字符串的名字表示字符串的第一个字符的地址。例如:
字符串操作:
char * ch = "helloworld"; *ch = 'w'; // 修改字符串中的字符
使用 new
和 delete
管理动态内存:
char * pstr = new char[5]; delete[] pstr;
注意:在 C++11 以后,auto
和 unique_ptr
是更推荐的选择。
字符串输入输出:
char str[20]; cin >> str; cout << str << endl;
当结构较小时,按值传递较为合理;当结构较大时,按指针或引用传递更为合理。例如:
按值传递:
struct Point { int x, y; }; Point read_point() { /* 读取输入 */ } Point p = read_point();
按指针传递:
void show(const Point * pxy) { cout << pxy->x << ", " << pxy->y << endl; } Point p; show(&p);
#includestring list[5]; // 读取输入: cin >> list[i];
#includeconst seasons = 4; array names = {"spring", "summer", "fall", "winter"}; array * pa; // 读取输入: cin >> (*pa)[i]; // 输出: cout << (*pa)[i] << endl;
C++ 不允许 main()
调用自己。递归函数需要谨慎处理栈深度。
int factorial(int n) { if (n == 0) return 1; return n * factorial(n - 1); }
double pam(int x); double (*pf)(int) = pam; void estimate(int line, double (*pf)(int)) { double x = (*pf)(5); // 或者: double x = pf(5); }
以上内容涵盖了 C++ 中的核心概念,理解这些内容是掌握语言的关键。
转载地址:http://herfk.baihongyu.com/