指向一整个数组的指针

C++易错点——指向一整个数组的指针

指针是C和C++中很重要的一个知识点。也是很易错的点。今天写一下比较容易错的一个点。就是指向一个指针的数组。主要的区别就是在做指针加法运算的时候,这个偏移量的不同。上代码举例:

#include <string>
#include <iostream>
#include <algorithm>

using namespace std;

int main(){
    int* p = new int[5];
    //p解释为数组的第一个值的地址
    cout << p << endl;
    cout << p + 1 << endl;
    delete [] p;

    int (*q)[5];
    //指向一整个数组的指针。直接偏移一整个数组的字节
    cout << q << endl;;
    cout << q + 1 << endl;
    return 0;
}

运行结果如下所示:
在这里插入图片描述
可以看到第一对输出的时候,p是指向一个元素数量为5的int型数组,p被解释为数组的第一个元素的地址(这一块和数组名的指针知识相同,不了解的小伙伴请自行查一下)。但是第二对输出的时候,偏移量却是20。所以这种申明方式,将q指向了一整个数组的地址。此外,这种申明的方式与运算符的优先级有关。如果省略了括号,q就会成为一个包含5个int*元素的数组。

PS

切记,new内存之后,别忘了delete掉。

### 数组指针指向数组的使用方法 在C/C++中,**数组指针**是种特殊的指针类型,它指向个完整的数组,而不是单个元素。当需要将数组作为参数传递给函数或动态访问数组时,这种指针非常有用。 #### 定义数组指针 要定义指向数组指针,可以使用以下语法: ```cpp 数据类型 (*指针名)[数组长度]; ``` 例如: ```cpp int (*p)[5]; // p是指向包含5个整数的数组指针 ``` #### 指针加减操作 由于数组指针指向的是整个数组,因此对其进行加减操作时,会按照整个数组的大小进行偏移。例如,如果`p`指向个包含5个整型元素的数组,那么`p + 1`会跳过这5个整型元素,指向数组[^4]。 #### 示例代码 以下代码展示了如何定义和使用指向数组指针: ```cpp #include <iostream> int main() { int a[5] = {1, 2, 3, 4, 5}; // 定义数组 int (*p)[5] = &a; // 定义数组指针并初始化为a的地址 for (int i = 0; i < 5; ++i) { std::cout << "元素 a[" << i << "] = " << (*p)[i] << std::endl; } return 0; } ``` 在这个例子中,`p`指向的是整个数组`a`,通过`(*p)[i]`可以访问数组中的每个元素[^4]。 #### 与普通指针的区别 - **普通指针**(如`int* p`)指向的是数组的第个元素,加1操作只会移动到下个元素。 - **数组指针**(如`int (*p)[5]`)指向的是整个数组,加1操作会跳过整个数组的长度[^2]。 #### 函数传参中的使用 在函数传参时,数组指针可以用于处理多维数组。例如,在传递二维数组时,可以通过数组指针来确保编译器正确理解数组的结构: ```cpp #include <iostream> void printArray(int (*arr)[5], int rows) { for (int i = 0; i < rows; ++i) { for (int j = 0; j < 5; ++j) { std::cout << arr[i][j] << " "; } std::cout << std::endl; } } int main() { int array[3][5] = { {1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15} }; printArray(array, 3); // 将二维数组传递给函数 return 0; } ``` 在这个例子中,`printArray`函数接受指向包含5个整数的数组指针,并能够正确地遍历二维数组的所有元素[^1]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值