Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 傻瓜指针_C_Function_Pointers - Fatal编程技术网

C 傻瓜指针

C 傻瓜指针,c,function,pointers,C,Function,Pointers,我只是学习了指针,并编写了一个非常简单的程序来检查我所理解的是否正确;我的想法是创建一个简单的函数,该函数获取一个整数值作为输入,并返回其地址 尽管这应该是地球上最简单的事情,但我在编译后收到了一条警告消息,我不知道为什么 #包括 #包括 //returnType functionName(类型arg1,类型arg2) int*返回值(int); int main(){ int x=1; int*p; p=&x; printf(“p:%p\n”,p); p=返回值(x); printf(“p:%

我只是学习了指针,并编写了一个非常简单的程序来检查我所理解的是否正确;我的想法是创建一个简单的函数,该函数获取一个整数值作为输入,并返回其地址

尽管这应该是地球上最简单的事情,但我在编译后收到了一条警告消息,我不知道为什么

#包括
#包括
//returnType functionName(类型arg1,类型arg2)
int*返回值(int);
int main(){
int x=1;
int*p;
p=&x;
printf(“p:%p\n”,p);
p=返回值(x);
printf(“p:%p\n”,p);
返回0;
}
int*返回值(int num){
return#
}
我应该得到同样的结果,但我不。。。我在哪里搞砸了

警告如下:

pointers.c:在函数“return\u me”中:
指针.c:21:2:警告:函数返回局部变量[-Wreturn local addr]的地址
return#
线路

p = return_me(x);
x
的值赋给函数中的变量
num
,类似于:

int num = x ;
p = &num ;
num
是一个不同的变量,具有不同的地址

还请注意,当您从函数返回其地址时,局部变量
num
不再存在,并且打印其地址也没有真正定义


大概是这样的:

int* return_me( int* pnum )
{
     printf("%d" , *pnum ) ;
     return pnum ;
}

问题是c中的参数总是按值复制的。 因此,您只能实例化一个新的int并将值复制到它
num

int x = 1;       // x is an int
int* p = &x;    // p is a pointer to an int

return_me(x)     // here you pass the integers value as "copy by value"
内部
return\u me()


将整数作为x传递给函数时,该函数不会获取x所在的地址。相反,它只是获取其价值。编译器通常通过将该值分配给某个寄存器或将其推送到堆栈上来传递该值。无论哪种方式,被调用函数都不能对其位置进行任何假设。相反,它只能利用它的价值。如果函数需要知道某个变量的地址,通常是因为它是一个OUT参数,这意味着被调用函数应该操作该值,并将其投射回调用函数,在这种情况下,调用函数应该传递指向该变量的指针,而不是它的值。

如果不使用“&”运算符,就无法在C中找到任意随机整数的地址。 您试图实现的函数是由“&”运算符本身实现的。
因此,您应该了解&operator以及它是如何在C中实现的。

我在这里重新编写了您的代码。有一些修改

#include <stdio.h>
#include <stdlib.h>

// returnType functionName(type arg1, type arg2)
int* return_me(int*);

int main(){
int  x = 1;
int *p;

p = &x;
printf("p: %p\n", p);

p = return_me(&x);
printf("p: %p\n", p);

return 0;
}

int *return_me(int *num){
 return num;
}
用图画表示

  X         P        num
+----+    +----+    +----+
| 1  |    |1000|    |1000|
+----+    +----+    +----+
 1000      2000      3000
Fig: 1a,1b,1c respectively.
代码

int x=1;
参见图1a

代码

p=&x;
参见图1b

代码

int *return_me(int *num){
其中num保持图1c所示的值

同样的值也返回给主函数

代码的问题是,您使用的是变量x的副本(即,按值调用),而不是变量x的实际地址(使用引用调用完成)。
当您发送x的副本时,变量的生存期将在声明它的函数中。当控件离开函数(即main())时,变量的生存期将被视为死亡,在您的情况下。

向一个好问题迈出的第一步:除了说您收到了一条警告消息,还发布了警告消息。局部变量num与变量xd不在同一内存位置。这是否意味着无法创建一个函数来完成我试图执行的操作?@FedericoGentile您应该在第一行中传递地址t place.dereference在函数中会给你值。嗯…如果我先传递地址,那么return\u me函数就没用了,因为它基本上什么都不做…我的目标是创建一个函数,将一个随机整数作为输入,将其地址作为输出…我现在知道num和x地址是混合的但我就是不知道怎么解决这个问题problem@FedericoGentile我认为这是可能的,你真的应该问一个新问题,因为这是一个不同的问题。@FedericoGentile:没有好的方法来定义一个函数来做你想做的事情;形式参数在内存中总是与实际参数不同的对象。你可以定义一个宏,如
#define RETURN_ME(x)和(x)
,尽管它不是很有用,并且它假设
x
将始终有一个地址(如果
x
是数值文本或不是左值的表达式,则情况并非如此)。
p=&x;
int *return_me(int *num){