我正在尝试学习c语言中的指针,并且一直在尝试针对不同类型的情况编写代码示例,这些情况涉及我在this C book中找到的指针
在“指针构造的示例”中,但我似乎无法弄清楚如何从函数返回指向内部指针的指针或如何在main中取消引用此类指针。
我一直在寻找一个简单的示例,但找不到一个可以清楚地说明我的示例。谁能解释这个概念,以及这些指针如何在函数内部工作?
我从函数返回指向int的指针没有任何问题,并且理解该过程,但是更高的级别给我带来了困难。 我一直在尝试写一些非常基本的示例,但是我无法设法在main中存储此函数返回的内容以及如何取消引用它:
int ***func(int x) {
int n = x * x;
int *p1, **p2, ***p3;
p1 = &n;
p2 = &p1;
p3 = &p2;
return &p3;
}
答案 0 :(得分:5)
最后,您的间接访问级别超出了所需:
return &p3;
p3
的类型为int ***
,它与函数的返回值匹配。但是,您返回的是p3
类型的int ****
的地址。这是类型不匹配。您可以通过返回p3
来纠正此问题:
return p3;
暂时假设您返回的指针(以及所有中间指针)都是有效的,则可以将函数的返回值分配给类型为int ***
的变量。然后,您必须取消引用3次才能获得实际的整数值:
int ***rval = func(2);
printf("value=%d\n", ***rval);
这里有一个更大的问题,那就是您不返回有效的指针。您要返回的指针值包含一个局部变量的地址(即p2
的地址)。当函数返回时,该变量超出范围,因此其地址无效。尝试取消引用超出范围变量的指针是undefined behavior。
为使函数返回后要指向的内存有效,您需要使用malloc
动态分配内存。
而且,实际上需要三重指针(即int ***
)非常罕见。如果您发现自己使用了这种类型的变量,则表明您需要重新考虑设计。