函数,该函数返回指向C中int的指针

函数,该函数返回指向C中int的指针,c,pointers,C,Pointers,我正在尝试学习c语言中的指针,并尝试为不同类型的情况编写代码示例,这些情况涉及我在c语言中找到的指针 在“指针构造示例”中,我似乎不知道如何从函数返回指向int的指针,或者如何在main中取消引用这样的指针 我一直在寻找一个简单的例子,但找不到一个能让我明白的。有人能解释一下这个概念,以及这些指针在函数中是如何工作的吗 我从一个函数返回指向int的指针时没有遇到任何问题,并且理解了这个过程,但是更高的级别给了我一段艰难的时间。 我一直在尝试编写非常基本的示例,但我无法将此函数返回的内容存储在ma

我正在尝试学习c语言中的指针,并尝试为不同类型的情况编写代码示例,这些情况涉及我在c语言中找到的指针

在“指针构造示例”中,我似乎不知道如何从函数返回指向int的指针,或者如何在main中取消引用这样的指针

我一直在寻找一个简单的例子,但找不到一个能让我明白的。有人能解释一下这个概念,以及这些指针在函数中是如何工作的吗

我从一个函数返回指向int的指针时没有遇到任何问题,并且理解了这个过程,但是更高的级别给了我一段艰难的时间。 我一直在尝试编写非常基本的示例,但我无法将此函数返回的内容存储在main中,也无法存储该函数的解引用方式:

int ***func(int x) {
    int n = x * x;
    int *p1, **p2, ***p3;
    p1 = &n;
    p2 = &p1;
    p3 = &p2;

    return &p3;
}

最后,您的间接寻址级别比您需要的多了一个级别:

return &p3;
p3
具有类型
int***
,该类型与函数的返回值匹配。但是,您返回的是
p3
的地址,其类型为
int****
。这是类型不匹配。您只需返回
p3
,即可更正此问题:

return p3;
假设您返回的指针(以及所有中间指针)是有效的,您可以将函数的返回值分配给
int***
类型的变量。然后必须取消引用3次才能获得实际整数值:

int ***rval = func(2);
printf("value=%d\n", ***rval);
然而,这里有一个更大的问题,那就是您没有返回有效的指针。返回的指针值包含局部变量的地址(即
p2
的地址)。当函数返回时,该变量超出范围,因此其地址无效。尝试取消引用指向范围外变量的指针是错误的

要使所指向的内存在函数返回后有效,需要使用
malloc
动态分配内存


此外,实际上需要三重指针的情况非常罕见(即
int***
)。如果您发现自己使用的是这种类型的变量,这是一个好迹象,表明您需要重新考虑您的设计。

最后,您的间接性级别比您需要的多了一个级别:

return &p3;
p3
具有类型
int***
,该类型与函数的返回值匹配。但是,您返回的是
p3
的地址,其类型为
int****
。这是类型不匹配。您只需返回
p3
,即可更正此问题:

return p3;
假设您返回的指针(以及所有中间指针)是有效的,您可以将函数的返回值分配给
int***
类型的变量。然后必须取消引用3次才能获得实际整数值:

int ***rval = func(2);
printf("value=%d\n", ***rval);
然而,这里有一个更大的问题,那就是您没有返回有效的指针。返回的指针值包含局部变量的地址(即
p2
的地址)。当函数返回时,该变量超出范围,因此其地址无效。尝试取消引用指向范围外变量的指针是错误的

要使所指向的内存在函数返回后有效,需要使用
malloc
动态分配内存


此外,实际上需要三重指针的情况非常罕见(即
int***
)。如果您发现自己使用的是这种类型的变量,这是一个好迹象,表明您需要重新考虑您的设计。

编写一些代码,如果您没有得到所需的输出,则共享代码,并阅读有关三次启动的程序如果您尝试学习指针,专注于
*
**
并忘记更高层次的间接性。如果您没有获得所需的输出,请编写一些代码,然后共享代码。如果您尝试学习指针,请阅读有关三次启动的程序,专注于
*
**
,忘记使用
malloc
实现的更高级别的间接操作。我同意三指针很少见,但我只是想了解指针和内存一般是如何工作的,我并没有在程序中实际使用它。“谢谢!”伊莎贝尔很高兴我能帮上忙。如果您觉得它有用,请随意使用。甚至从
func(2)初始化到
rval
是UB。可以使用
malloc
进行管理。我同意三指针很少见,但我只是想了解指针和内存一般是如何工作的,我并没有在程序中实际使用它。“谢谢!”伊莎贝尔很高兴我能帮上忙。如果您觉得它有用,请随意使用。甚至从
func(2)初始化到
rval
为UB。