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