首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

Stack Overflow用户

发布于 2010-10-19 01:22:33

这段代码有两个主要问题。

代码语言:javascript
运行
复制
MyFunction(int **array, int row, int col);

第一个问题是int **array是错误的类型。这是指向指针的指针,而

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

是一个多维数组。组成这个多维数组的内存都是一个块,并且从这个数组的开头到这个数组的任何元素的偏移量都是基于对这个数组中一行的大小的了解来计算的。

代码语言:javascript
运行
复制
int *A[99];

这是一个指向整数的指针数组。所指向的整数可能是内存中几个整数中的第一个,这意味着这些整数实际上指向整数数组。

在许多情况下,当您在程序中使用数组的名称时,它的计算结果是指向数组开头的指针。如果你说:

代码语言:javascript
运行
复制
int array[3][3] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
printf("%p %p %p\n", array, array[0], &(array[0][0]) );

您应该将相同的地址打印3次,因为它们都指向相同的地址,但它们的类型并不相同。后两者的数据类型相似,并且在许多方面都是兼容的,因为array[0]将被视为指向array第一行的第一个元素的指针,而该行本身就是一个数组。

如果你说:

代码语言:javascript
运行
复制
int **A;

您是说有一个指向int的指针。虽然A[2][4]是一个有效的表达式,但它不是多维数组,其方式与:

代码语言:javascript
运行
复制
int B[3][3];

如果你说A[1],这将计算成一个类似于B[1]int *,除了你可以说A[1] = (int *)0x4444;,但是如果你说B[1] = (int *)0x4444;,你会得到一个编译器错误,因为B[1]实际上是一个计算值,而不是一个变量。对于B,没有int *变量的数组--只是根据行大小和数组的第一个成员的地址进行一些计算。

这段代码应该做一些与您想要的事情类似的事情(为了可读性,对输出格式进行了一些更改)。请注意print语句中的索引值是如何更改的。

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

main()
{
    int array[3][3] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
    MyFunction(array, 3, 3);
}
票数 0
EN
查看全部 6 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3911244

复制
相关文章

相似问题

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