C++中指针混淆问题

3

我对c++课程中的幻灯片感到困惑。一方面,在示例1中,int(*foo)[5]是指向包含5个元素的整数数组的指针,但在示例2中,int(*numbers2)[4]指向类型为整数的数组(4个数组)的数组。这两个如何拥有相同的左手声明但持有不同的类型?

#include <iostream>
using std::cout;
using std::endl;


int main() {

    //Example1
    int numbers[5] = { 1,2,3,4,5 };
    int(*foo)[5] = &numbers;
    int *foo1 = *foo;


    //Example2 
    int numRows = 3;
    int(*numbers2)[4] = new int[numRows][4];
    delete[] numbers2;


    return 0;

}

1
numbers2 指向动态数组的第一个元素。这就是 new 表达式的工作原理。 - Kerrek SB
2
想一想...如果你分配了一个普通的整数数组,那么new int[numRows]会返回int*。因此,当你分配一个数组的数组时,你会得到一个指向数组的指针,或者在你的特定情况下是int (*)[4] - Some programmer dude
2
一个 int* 可以指向单个整数或整数数组的第一个元素的地址。同样,指向数组的指针也是如此。它可以指向单个数组或者数组数组的第一个元素的地址。 - Galik
2个回答

3

请查看指针声明参考

Because of the array-to-pointer implicit conversion, pointer to the first element of an array can be initialized with an expression of array type:

int a[2];
int* p1 = a; // pointer to the first element a[0] (an int) of the array a

int b[6][3][8];
int (*p2)[3][8] = b; // pointer to the first element b[0] of the array b,
                     // which is an array of 3 arrays of 8 ints
基本上说,左手边的 numbers2foo 在右手边所指向的内容是很重要的。
因此,在以下代码中,numbers2 指向一个 临时(但未命名)数组的第一个元素,该数组是由 4 个整数的 numRows 数组组成。
 int(*numbers2)[4] = new int[numRows][4];

foo指向了包含5个整数的数组numbers的第一个元素。

int(*foo)[5] = &numbers;

2
你问题中对第二个示例的描述并不完全正确。
试着这样表述,你会发现它们是平行的:
- `foo` 是指向第一个对象的指针,每个对象都是由5个元素组成的整数数组。(事实上,只有第一个) - `numbers2` 是指向第一个对象的指针,每个对象都是由4个元素组成的整数数组。(事实上,总共有 `numRows` 个)
指针数据类型并不能告诉你它所指向的对象数量,只能告诉你每个对象的类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接