C、C++中的二维数组指针

6

我正在学习指针相关知识:

int x[10]; 
int *p = &x

这将创建一个指向第一个元素的指针类型为int。因此,如果我有一个二维数组,我需要使用双重指针:第一个指针将指向数组的第二个维度。这意味着:

int x[3][4] = {{1,2,3,4},{5,6,7,8},{9,9,9,9}};

当我想要引用它时,我必须像这样声明第二个维度的大小,是吗?

int *p[4] = x;

或者还有一种方法是通过输入:int **p;?

int *p[4] 是整数指针数组,它需要 4 * (sizeof(int*)) 的空间,对吗?


1
顺便说一句:在C++中尽量避免使用指针。使用std::vectorstd::array代替C风格的数组。 - xtofl
"int *p[4] 是一个包含 4 * (sizeof(int*)) 个整型指针的数组,对吗?" - 是的。并且始终使用启用警告的编译选项 (-Wall -Wextra) 进行编译。这样,在编译代码时,您将会注意到关于不兼容指针类型的警告信息。这将为您提供某些有问题的迹象。 - Spikatrix
1
好的...你的第一个例子是错误的(正如其他人已经告诉你的那样),编译器会给你一个警告。你的第二个例子与你在注释中写的不同 int *p[4] vs int (*p)[4]. 你标记了你的输出为 size of *p,但是却使用了 sizeof(p)(p是一个指针,在C语言中所有指针的大小都相同)...也许你应该尝试学习更多。 - edc65
@xtofl 你是指数组,而不是指针,对吧?在C++中,没有指针你什么都做不了。 - Quentin
@Quentin:我应该说“推迟使用”指针。指针是最难掌握的东西之一,最好隐藏在标准库提供的美妙概念下面。如果你有时间,可以花一个小时看看这个视频 https://www.youtube.com/watch?v=YnWhqhNdYyk! - xtofl
显示剩余3条评论
4个回答

8
这会将指针类型(int)指向第一个元素..
不可以。
&x 是数组x的地址,类型为int (*)[10],不能赋值给int *类型。两种类型不兼容。
所以,如果我有一个二维数组,我需要使用双指针:第一个指针将指向数组的第二个维度。
不需要。
在表达式中,除了sizeof和一元&运算符之外,数组都被转换为指向其第一个元素的指针。因此,在这种情况下,x的类型在转换后将为int (*)[4]。您需要一个指向4个int数组的指针,而不是4个指针的数组。
 int (*p)[4] = x;

嗯,是的。我的意思是指针指向一个整数,这个整数是数组x的第一个元素。我的问题实际上是这样的: int (*p)[4] = x;这是4个指针(指针数组)还是1个指针? - Hasan alattar
in *p[4] 声明了一个 4个指针 的数组。这里的 p 是一个数组。 - haccks
肯定不可能。如果p是一个数组,它应该是16字节。 - haccks

3

补充一下,第一个示例不正确。

x 是一个包含 10 个 int 的数组。p 是指向 int 而不是指向包含 10 个 int 的数组的指针。当被赋值给 p 时,x 衰变为指向 int 的指针类型。

赋值应该简单地写成:

int* p = x;

1

示例程序:

#include <stdio.h>
main(int argc, char* argv[])
{
    int x[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 987, 9, 9 } }; 
    int(*p)[4] = x; printf("p[2][1] %d", p[2][1]); 
    printf("\nsizeof(p) is : %d \nsizeof(*p) is : %d\n", sizeof(p), sizeof(*p)); 
}

输出

p[2][1] 987
sizeof(p) is : 4
sizeof(*p) is : 16

在我的系统(和你的一样),int和指针都是32位的。因此,指针的大小为4,int的大小也为4。
首先,p是一个指针,而不是数组。它的大小是4,没有多余的部分。那就是你问题的答案。
现在,只是为了添加一些有用的信息: p是指向一个包含4个整数的数组的指针。p指向的内容的大小为4*4==16。(尝试将示例程序中的int更改为short,你会得到sizeof(*p) is : 8
我可以分配p=x,因为类型正确,现在p包含x的地址,p[0]x[0]相同(都是由4个整数组成的数组)。p[2][3]x[2][3]*(p[2]+3)相同。p[2]指向x的第2个元素,p[2]+3指向x[2]的第3个元素。(所有索引都从0开始)

-2
// Here is not complicated matrix of size
int p[2][4]={
              {1,2,3,4},
              {5,6,7,8}
            };
// points to the first Elements :: ptr
int (*ptr)[0] = &p;
// Now have the same adresse ( ptr and p )
printf("Hello world! %d \n",ptr[1][3]); // show  4 

2
Untitled1.cpp|35|错误:无法将'int () [2] [4]'转换为'int () [0]'进行初始化| - Hasan alattar

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