C++指针数组、数组指针、数组名及二维数组技巧汇总
在C++中,指针数组、数组指针、数组名及二维数组是比较容易混淆的概念,下面我们一一介绍。
数组名
数组名是一个常量指针,指向数组的第一个元素的地址。例如,下面的代码定义了一个整型数组arr,arr即指向数组第一个元素的地址。
int arr[10];
int *p = arr; // arr等价于&p[0]
指针数组
指针数组是由一组指针构成的数组,也就是说,数组中每个元素都是一个指针。例如,下面代码定义了一个存放5个指向int类型变量的指针的指针数组ptrArr。
int *ptrArr[5]; // 指针数组
数组指针
数组指针是一个指向数组的指针。例如,下面代码定义了一个指向整型数组的指针arrayPtr。
int arr[10];
int (*arrayPtr)[10] = &arr; // 数组指针
二维数组
二维数组是一个数组,其中的每个元素又是一个数组,也就是在一个数组中放置了若干数组。例如,下面代码定义了一个3行4列的二维整型数组val。
int val[3][4]; // 二维数组
数组指针和指针数组的区别
数组指针指向一个数组,指针数组是一个数组,数组中的元素都是指针。二者的语法形式不同,使用方法也不同。例如,下面代码展示了如何对一个存储字符指针的指针数组进行初始化:
char *str[3] = {
"Hello",
"World",
"C++"
};
而下面代码展示了如何使用数组指针对一维数组进行初始化:
int arr[5] = {1, 2, 3, 4, 5};
int (*ptr)[5] = &arr;
二维数组的技巧
使用指针访问二维数组
使用指针访问二维数组可以大幅提高访问效率,因为指针访问数组可以使用指针运算,避免了重复的下标计算。
int val[3][4];
int (*p)[4] = val; // 定义指向二维数组的指针
// 使用指针遍历访问二维数组
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
*(*p + 4 * i + j) = i * j;
}
}
定义二维数组参数
当定义一个参数是二维数组的函数时,可以使用行数明确指定二维数组的列数,也可以省略行数,让编译器自动推导列数。例如,下面展示了两种不同的定义方式:
// 声明时指定列数
void print_array(int arr[][5], int rows) {
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < 5; ++j) {
cout << arr[i][j] << " ";
}
cout << endl;
}
}
// 编译器自动推导列数
void print_array_auto(int (*arr)[5], int rows) {
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < 5; ++j) {
cout << arr[i][j] << " ";
}
cout << endl;
}
}
以上就是C++指针数组、数组指针、数组名及二维数组的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++指针数组、数组指针、数组名及二维数组技巧汇总 - Python技术站