发现了一个有趣的c语言问题,请各位大神帮忙解释一下。
在vc里先定义一个变量inta;,再用printf(“%d”,&a);输出地址来,记住地址的值,比如结果是20000,然后在用scanf("%d",20000);发现可以...
在vc里先定义一个变量int a;,再用printf(“%d”,&a);输出地址来,记住地址的值,比如结果是20000,然后在用scanf("%d",20000);发现可以对a赋值,(可能你会认为再次编译地址值会改变,但实际上并没有改变。可以用printf试一试);但是如果自己定义一个函数比如f(*pointer);然后在用这种方法就会报错,为啥啊,scanf的原型中不是*p吗?百思不得其解啊,求大神帮助啊,问了老师他也说不清
展开
6个回答
展开全部
1.之所以再次编译值不改变,乃是因为系统在加载可执行镜像时所选取的栈的初始地址是相对固定的,a就在这个栈上,而且程序开始到main函数执行,这是一段按部就班的例程,没有什么变数,所以a的地址不变是可以理解的。
2.scanf("%d",20000)这句合法并没有什么难以理解的地方,因为指针归根到底也只是一个地址值罢了,直接用地址值和直接用指针,这没有任何区别,最多就是编译器会警告你一下。
不知道你说的“”自己定义一个函数比如f(*pointer);然后在用这种方法就会报错“”是什么意思
看下面代码
#include <stdio.h>
int ge(int *p)
{
*p=3;
return 0;
}
int main()
{
int a;
printf("%d\n",&a);
ge(2293532);
printf("%d\n",a);
return 0;
}
如果你的意思是像上面代码一样,那么这段代码我已试过了,并没有报错,完全可以正常运行,最后输出3.
欢迎继续讨论
2.scanf("%d",20000)这句合法并没有什么难以理解的地方,因为指针归根到底也只是一个地址值罢了,直接用地址值和直接用指针,这没有任何区别,最多就是编译器会警告你一下。
不知道你说的“”自己定义一个函数比如f(*pointer);然后在用这种方法就会报错“”是什么意思
看下面代码
#include <stdio.h>
int ge(int *p)
{
*p=3;
return 0;
}
int main()
{
int a;
printf("%d\n",&a);
ge(2293532);
printf("%d\n",a);
return 0;
}
如果你的意思是像上面代码一样,那么这段代码我已试过了,并没有报错,完全可以正常运行,最后输出3.
欢迎继续讨论
更多追问追答
追问
我的报错了,我试了好多次。而且根据值传递的规则,其实就是等价于int *p;p=2293532;在vc中,2293532是一个int型的。而p是int*为啥可以进行出传递啊,应该报错啊
追答
这应该就是编译器问题了,我用的是gcc,对这类问题只是警告,vc可能就要报错,这种时候你可以用强制类型转换来避免报错,这样写:
f((int*)2293532)
强制转为int*进行传递
试试吧
展开全部
每个函数都有一个栈区,是一块连续的内存空间,&a得到的是变量相对于栈顶的偏移地址所以是不变的,所以是对的。
你定义各函数,那这个函数又有一个属于自己的栈区,而且当这个函数调用结束后,这个栈就会被销毁,所以你定义各新函数这样做是不对的,
你定义各函数,那这个函数又有一个属于自己的栈区,而且当这个函数调用结束后,这个栈就会被销毁,所以你定义各新函数这样做是不对的,
追问
不是,你大概还没有弄明白我的意思,你可以看一看楼上的代码,我就是那个意思
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的意思是定义一个函数,能返回一个地址,如: int* f(){...}
然后再 scanf("%d",f())
是这样吗?
然后再 scanf("%d",f())
是这样吗?
更多追问追答
追问
不是,就是在定义一个函数如void f(*p){……};然后在定义一个变量int a; 用printf()输出地址,在用f(上述地址(数字));发现报错了
追答
明白。
首先,请看scanf函数的原型:int scanf( const char *format, ... )
其中的形参...表示参数个数不定,而其类型不定(注意类型不定!!类型确定是在scanf内部),后面参数的类型是由前面的const char *format所决定,所以当你scanf("%d", 20000),因为参数一写明了是"%d",所以scanf的实现会把20000这个数在内部强制转换为int*,所以编译肯定没错~
但当你: f(20000)时,你并没有把20000转为一个int*,所以出错~
强制转换后就正确了:
#include
void f(int* x)
{
printf("%d", *x);
}
int main()
{
int a;
scanf("%d", 2293532); //我这里a的地址是2293532
f((int*)(2293532));
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你要研究scanf 函数的实现方法。它的第二个参数不是指针(可以理解成是变量)。
追问
那他的函数原型是什么啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
做任务,打酱油
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-01-09
展开全部
围观蹭经验的,也学习到了这个有趣的现象,受教了~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询