gpt4 book ai didi

c - 在 C 中使用 ** 时的差异

转载 作者:太空狗 更新时间:2023-10-29 16:19:22 25 4
gpt4 key购买 nike

我最近开始学习 C,但我在理解指针语法时遇到了问题,例如,当我编写以下行时:

int ** arr = NULL;

我怎么知道:

  • arr是一个指向整型指针的指针

  • arr 是指向整数指针数组的指针

  • arr 是指向整数数组指针数组的指针

int ** 不是都一样吗?


同样问题的另一个问题:

如果我有一个接收 char ** s 作为参数的函数,我想将它作为指向字符串数组的 pointer 来引用,意思是指针指向指向 chars 数组的指针数组,但它是否也是指向指向 char 的指针的指针?

最佳答案

Isn't it all the same with int **?

您刚刚发现了类型系统中的一个缺陷。您指定的每个选项都可以为真。它本质上源自程序内存的平面 View ,其中单个地址可用于引用各种逻辑内存布局。

自从 C 诞生以来,C 程序员一直在处理这个问题的方法是制定一个约定。例如要求接受此类指针的函数的大小参数,并记录它们对内存布局的假设。或者要求数组以特殊值终止,从而允许指向缓冲区的指针的“锯齿状”缓冲区。


我觉得需要进行一定程度的澄清。正如您在此处查阅其他非常好的答案时所看到的,数组绝对不是指针。然而,在足够多的背景下,它们确实会腐烂成某些东西,以至于在教授它们时会犯下长达数十年的错误(但我离题了)。

我原来写的引用代码如下:

void func(int **p_buff)
{
}

//...

int a = 0, *pa = &a;
func(&pa);

//...

int a[3][10];
int *a_pts[3] = { a[0], a[1], a[2] };
func(a_pts);

//...

int **a = malloc(10 * sizeof *a);
for(int i = 0; i < 10; ++i)
a[i] = malloc(i * sizeof *a[i]);
func(a);

假设 func 并且每个代码片段都在一个单独的翻译单元中编译。每个示例(除非我有任何拼写错误)都是有效的 C。当作为参数传递时,数组将衰减为“指向指针的指针”。 func 的定义是如何仅通过其参数类型就知道它究竟传递了什么!?答案是不能。 p_buff 的静态类型是int**,但它仍然允许func 间接访问(部分)有效类型截然不同的对象。

关于c - 在 C 中使用 ** 时的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42065293/

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