gpt4 book ai didi

c - 将指针传递给 C 中的指针

转载 作者:行者123 更新时间:2023-11-30 14:21:58 24 4
gpt4 key购买 nike

编译:

#include <stdlib.h>


void f(int ** v)
{
}

int main()
{
int v[2][3];
f(v);
return 0;
}

失败原因:

g.cpp:13:8: error: cannot convert ‘int (*)[3]’ to ‘int**’ for argument ‘1’ to ‘void f(int**)’

但是以下更改已通过:

#include <stdlib.h>


void f(int ** v)
{
}

int main()
{
int * v[2];
f(v);
return 0;
}

在我看来,数组的更深维度必须在编译时解决,有人可以详细说明吗?

最佳答案

C 和 C++ 自动将数组强制转换为指针。该错误是由于这种强制仅发生一次(即仅在第一级)而引起的。这意味着int [10]将被强制为 int * ;但是int [10][10]最多可以被强制为 int *[10] .

原因与内存布局有关。你看,a[i]翻译为*(a + sizeof(T) * i)如果a类型为T * (假设与指针相加,直接相加,不进行缩放);但如果a类型为T [N] , a[i]翻译为*(&a[0] + i) 。因此,可以得出 T [N] 类型的值可以强制转换为 T * 类型的值通过获取第一个元素的地址——在这种情况下内存布局是兼容的。

但是,二维数组a (例如 T [2] [4] 类型)的存储方式与双指针( T ** 类型)不同。在第一种情况下,您有四个元素 T [0][0]T [0][3]布置在内存中,后跟 T [1][0]T [1][3]等等,模对齐。在第二种情况下,您只有一堆指针(指向 T )一个接一个地排列。在第一种情况下,a[i][j]将降低为 *(&a[0][0] + sizeof(T) * 4 * i + sizeof(T) * j)而在第二种情况下,它将降低为 *(*(a + sizeof(T) * i) + sizeof(T) * j) 。内存布局不再兼容。

关于c - 将指针传递给 C 中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14264950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com