【C/C++】数组指针
数组指针
定义:指向数组的指针,本质是一个指针。一般有三种定义方式。
1)typedef int(ArrayType)[5]
以上代码使用typedef关键字定义了一个新的数据类型int [5];
因此ArrayType arr与int arr[5]是等价的;
示例代码:
int arr[5] = {0, 1, 2, 3, 4};
typedef int(ArrayType)[5]; // 定义了一个新的类型,等价于 int ArrayType[5]
ArrayType* pArr = &arr;
for (int i = 0; i < 5; i++) {
printf("arr[%d] = %d\n", i, arr[i]);
}
for (int i = 0; i < 5; i++) {
printf("pArr[%d] = %d\n", i, newArr[i]);
}
输出:
arr[0] = 0
arr[1] = 1
arr[2] = 2
arr[3] = 3
arr[4] = 4
pArr[0] = 0
pArr[1] = 1
pArr[2] = 2
pArr[3] = 3
pArr[4] = 4
2)typedef int(*ArrayType)[5]
以上代码定义了一个数组指针,ArrayType是一个指针类型并且他指向一个数组;
示例代码:
int arr[5] = {0, 1, 2, 3, 4};
typedef int(*ArrayType)[5];
ArrayType pArr = &arr;
for (int i = 0; i < 5; i++) {
printf("arr[%d] = %d\n", i, arr[i]);
}
for (int i = 0; i < 5; i++) {
printf("pArr[%d] = %d\n", i, (*pArr)[i]);
}
输出:
arr[0] = 0
arr[1] = 1
arr[2] = 2
arr[3] = 3
arr[4] = 4
pArr[0] = 0
pArr[1] = 1
pArr[2] = 2
pArr[3] = 3
pArr[4] = 4
3)int (*pArr)[5] = &arr
示例:
int arr[5] = {0, 1, 2, 3, 4};
int (*pArr)[5] = &arr;
for (int i = 0; i < 5; i++) {
printf("arr[%d] = %d\n", i, arr[i]);
}
for (int i = 0; i < 5; i++) {
printf("pArr[%d] = %d\n", i, (*pArr)[i]);
}
输出:
arr[0] = 0
arr[1] = 1
arr[2] = 2
arr[3] = 3
arr[4] = 4
pArr[0] = 0
pArr[1] = 1
pArr[2] = 2
pArr[3] = 3
pArr[4] = 4
作为函数参数的多维数组
作为函数参数的多维数组名的传递方式和一维数组名相同-实际传递的是个指向数组第1个元素的指针,但是,两者之间的区别在于,多维数组的每个元素本身是另外一个数组,编译器需要知道他的维数,以便作为函数形参的下标表达式进行求值。以下两个例子说明了两者之间的区别:
int vector[10];
...
func1(vector)
参数vector的类型是指向整型的指针,所以func1的原型可以是下面两种的一种:
void func1(int *vec);
void func1(int vec[]);
作用于vec上面的指针运算把整型的长度作为它的调整因子。
现在我们看一下矩阵:
int matrix[3][10];
...
func2(matrix);
这里,参数matrix的类型是指向包含10个整型元素的数组指针。func2的原型可以是下面两种的一种:
void func2(int (*mat)[10]);
void func2(int mat[][10]);
在这个函数中,mat的第1个下标根据包含10个元素的整型数组的长度进行调整,接着第2个下标根据整型的长度进行调整,这和原先的matrix数组一样。
注意:一下声明是不正确的
void func2(int **mat);
原因:考虑利用mat[i][j]访问元素,上面错误的声明编译器无法通过偏移量找到对应的元素。
如果声明为int mat[][10],则利用mat[i][j]访问元素则可以转换为mat + i * 10 + j找到对应的元素。

浙公网安备 33010602011771号