c - 从函数返回的衰减多维数组

标签 c arrays pointers

(gcc) Multi-Dim Array or Double Pointer for Warning-free Compile 有关,有没有办法从函数返回所谓的“衰减数组指针”?总之(假设 2 个昏暗数组)返回 int (*a)[5] 格式而不是 int** 格式?

据我所知,当返回的 int** 指针被发送到另一个等待 (int*)[] 参数的函数时,它无法正常工作。

最佳答案

是的,但是语法看起来不太好

int(*f())[5] {
  static int a[1][5] = { { 1, 2, 3, 4, 5 } };
  return a;
}

基本上,它只是您的 af() (一个函数)所取代。使用 typedef 它变得更具可读性

typedef int inner_array[5];

inner_array *f() {
  // like before ...
}

请注意,要表示没有名称的抽象类型,您需要编写 int(*)[5]。也就是说,您只需删除名称即可。 (int*)[5] 是无效语法。

你是对的 - 你不能返回 int** 因为这意味着你有一个指向指针的指针。使用 f()[A][B] 访问将从返回的指针给出的地址读取,然后依次从该指针给出的地址再次读取。但实际上,您返回的数组指针仅指向一个内存块,因此如果您进行两次间接寻址,您将尝试将数据重新解释为指针。

相反,如果您返回 int(*)[5] 并执行 f()[A][B],您将不会从该地址读取任何值由指针返回。相反,您只需将偏移量 A 添加到地址,并将类型从 int(*)[5] 调整为 int[5]有一个数组,该数组引用调整后地址处的内存。下一个索引将再次调整 B 并且由于它在 int* 上运行(在数组衰减之后),不再在数组指针上运行,它将读取存储在调整后地址的内容,最终产生 int。这是非数组指针和数组指针的重要区别。

如果需要,您可以试验一下。考虑这两个片段。一个可能会崩溃,但另一个可能不会(但两者都会产生未定义的行为,所以这不应该在实际程序中完成)

int *pi = 0; 
int(*pa)[5] = 0;

int i = *pi; // read int stored at null-pointer address!
int *a = *pa; // does not read any data from address, just adjusts the type!

关于c - 从函数返回的衰减多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2529041/

相关文章:

python - 在 python 中实现 C 代码循环

c++ - 将变量中的值取消引用为指针地址

c++ - 将指针传递给静态方法

关于在 C 中使用 define 指令(#define)重新定义常量的困惑

arrays - 与不同 ID 关联的查找和求和值

java - 迭代 3d 数组?

javascript推送重复值

c++ - 空指针指针(void **)

c++ - 为什么使用指向函数的指针调用虚函数时不需要 "this"指针?

c - 如何从终端用 C 语言逐行读取文件?