【C/C++】数组指针

数组指针

定义:指向数组的指针,本质是一个指针。一般有三种定义方式。

1)typedef int(ArrayType)[5]

以上代码使用typedef关键字定义了一个新的数据类型int [5];

因此ArrayType arrint 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找到对应的元素。

posted @ 2023-07-31 17:10  醉梦临川  阅读(194)  评论(0)    收藏  举报