C++中的数组指针和指针数组

using namespace std;
int main(){
    
    //a) 一个整型数( An integer)
    int a;
    //b) 一个指向整型数的指针( A pointer to an integer)
    int *b;
    //c) 一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an integer)
    int **c;
    //d) 一个有 10 个整型数的数组( An array of 10 integers)
    int d[10];
    //e) 一个有 10 个指针的数组,该指针是指向一个整型数的( An array of 10 pointers to integers)
    int *e[10]
    //f) 一个指向有 10 个整型数数组的指针( A pointer to an array of 10 integers)
    int (*f)[10];
    //g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数( A pointer to a functionthat takes an integer as an argument and returns an integer)
    int *g(int);
    //h) 一个有 10 个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer 
    int (*h[10])(int);
    return 0;
}

关键点在于:
1、[]优先级高于*
2、根据优先级判定是一个数组还是一个指针。

例如:int * e[10], 由于[]优先级高于*, 因此e[10]为一个整体,类比于int * a ,也就是一个指针,只不过指向的是一个数组。因此,它是一个指针,指向数组的指针,也就是数组指针。数组中的每一个元素都是一个指针,指向的是int变量。

int (*f)[10], 根据优先级,首先编译器认定它是一个数组,数组中的每个变量都是int类型,指针f指向该数组。也就是一个指针数组。

### C++数组指针指针数组的区别 #### 指针数组 指针数组是一个数组,其元素都是指针类型的变量。这意味着每一个元素都可以存储一个地址。声明指针数组时需要指定数组的大小以及指针指向的数据类型。 ```cpp int* ptrArray[10]; // 声明了一个含有10个整数指针数组[^1] ``` 上述代码创建了一个名为 `ptrArray` 的数组,它可以保存十个指向整型数据的指针。每个指针可以独立地指向不同的内存位置。 #### 数组指针 数组指针则是指向整个数组指针。为了声明这种类型的指针,应该把星号放在圆括号内紧挨着指针名称之前,这样表明这是一个指向特定长度数组指针而不是简单的指针数组。 ```cpp int (*arrPtr)[4]; // 创建一个指向四个整数构成的数组指针[^2] ``` 这里定义了 `arrPtr` 是一个指向由四个连续整数组成的一维数组指针。当初始化或赋值给这类指针时,通常传入的是某个实际一维或多维数组的名字作为右操作数。 #### 使用差异 对于 **指针数组** 来说,可以通过遍历的方式逐个访问各个指针成员并间接获取它们指向的对象: ```cpp for (size_t i = 0; i < sizeof(ptrArray)/sizeof(*ptrArray); ++i){ std::cout << *ptrArray[i] << ' '; } std::cout << '\n'; ``` 而对于 **数组指针**, 若要访问被指向数组的内容,则需先解引用得到首元素的位置再进一步索引: ```cpp // 初始化一些测试数据 int data[] = {1, 2, 3, 4}; arrPtr = &data; // 访问第一个元素 std::cout << (**arrPtr) << "\n"; // 或者使用偏移量来访问其他元素 std::cout << (*(arrPtr))[2] << "\n"; // 输出第三个元素(下标从零开始计) ``` 需要注意的是,在处理数组指针的时候一定要确保不会发生越界读写行为,因为这可能导致程序崩溃或者其他未定义的行为[^3].
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值