首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于指针和多维数组的混淆

关于指针和多维数组的混淆
EN

Stack Overflow用户
提问于 2010-10-12 10:17:58
回答 6查看 2.7K关注 0票数 5

如果可能出现以下情况:

代码语言:javascript
运行
复制
MyFunction(int *array, int size)
{
    for(int i=0 ; i<size ; i++)
    {
        printf(“%d”, array[i]);
    }
}

main()
{
    int array[6] = {0, 1, 2, 3, 4, 5};
    MyFunction(array, 6);
}

为什么下面的不是呢?

代码语言:javascript
运行
复制
MyFunction(int **array, int row, int col)
{
    for(int i=0 ; i<row ; i++)
    {
        for(int j=0 ; j<col ; j++)
        {
            printf(“%d”, array[i][j]);
        }
    }
}

main()
{
    int array[3][3] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
    MyFunction(array, 3, 3);
}
EN

回答 6

Stack Overflow用户

发布于 2010-10-12 10:32:31

编辑:根据您的新示例代码,根据您的请求,我尝试了一个更中肯的答案:

不管数组的维数如何,您传递的是一个“指向数组的指针”--它只是一个指针,尽管指针的类型可能会有所不同。

在第一个示例中,int array[6]是一个由6个int元素组成的数组。传递array会传递一个指向第一个元素的指针,该元素是一个int,因此参数类型是int *,它可以等效地写成int []

在第二个示例中,int array[3][3]是一个包含3行(元素)的数组,每行包含3个int。传递array会传递指向第一个元素的指针,该元素是包含3个int__s的数组。因此类型为int (*)[3] -指向包含3个元素的数组的指针,可以等效地写为int [][3]

我希望你现在能看到不同之处。当您传递int **时,它实际上是指向int *数组的指针,而不是指向2D数组的指针。

实际int **的示例如下所示:

代码语言:javascript
运行
复制
int a[3] = { 1, 2, 3 };
int b[3] = { 4, 5, 6 };
int c[3] = { 7, 8, 9 };
int *array[3] = { a, b, c };

这里的array是一个由3个int *组成的数组,将其作为参数传递将产生一个int **

原始答案:

您的第一个示例并不是真正的二维数组,尽管它的使用方式与此类似。在这里,您创建了ROWSchar *指针,每个指针指向一个不同的COLS字符数组。这里有两个层次的间接性。

第二个和第三个示例实际上是2D数组,其中整个ROWS * COLS字符的内存是连续的。这里只有一层间接性。指向二维数组的指针不是char **,而是char (*)[COLS],因此您可以这样做:

代码语言:javascript
运行
复制
char (*p)[SIZE] = arr;
// use p like arr, eg. p[1][2]
票数 5
EN

Stack Overflow用户

发布于 2010-10-18 21:07:29

其他人几乎总结了这一点。int **A表示A是指向数组的指针,而不是指向二维数组的引用。然而,这并不意味着它不可用。因为C中的数据是以行为主的顺序存储的,所以一旦知道了行的长度,检索数据就应该很容易了

票数 1
EN

Stack Overflow用户

发布于 2010-10-12 10:20:09

因为指针指针与指向数组的指针不是同一类型。详情请参见pointers to pointers and pointer arrays

另外,这里有一些好的信息:http://c-faq.com/aryptr/index.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3911244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档