C语言关于指针以及函数的传值运算这一块
有两个题:#include<stdio.h>
int k=5;
void f(int *s)
{
*s=k;
}
void main()
{
int m=3,*p=&m;
f(p);
printf("%d,%d",m,*p);
}
这一题的答案是5,5. 为什么m的值会从3变成5? 指针p开始指向m的地址,通过函数f使得指针p指向k的地址。所以最后输出的*p值为5.p指针指向的地址改变了,m的值也会改变??为什么?
第二题类似,是我在百度上看到的:
有以下程序
#include<stdio.h>
intk=5;
void f(int*s)
{ s=&k;
*s=7;
}
main( )
{intm=3;
f(&m);
printf("%d,%d\n", m, k);
}
程序运行后的输出结果是( )。
A
3,7
B
7,7
C
5,7
D
3,5
【答案】
A
【解析】
本题中s得到的是k的地址,而s的内容为7,所以k的值就变成了7,而题目中m的地址并没有发生变化,从而m的值依然为3。
为什么解析说m的地址没有发生改变?如果类似上题的思路,通过函数f,m的地址应该发生改变,所以最后输出来m的值也发生了改变。
我记得传值运算,如果传的是地址那么就是双向的,如果传的是数值那么就是单向的对吧??希望好心人能够详细地讲一讲,在这里谢谢大家!!
void f(int *s)
{
*s=k; //这里是将k的值给*s 此时指针s的地址依然指向m;如果改成*s=&k; 指针s指向的地址才会改变;
}
void f(int*s)
{ s=&k; //这道题,这里把指针s的指向地址改变了,指向k的地址;
*s=7; //这里再把7付给指针s相当于赋给k;所以m不变,k为7;
}
两道题的区别是前者指针指向的地址没变,所以m随指针s的值改变而改变;后者指针在函数里不在指向m了,所以m不会发生改变; 82457097 发表于 2019-2-3 13:15
void f(int *s)
{
*s=k; //这里是将k的值给*s 此时指针s的地址依然指向m;如果改成*s=&k ...
#include<stdio.h>
int k=5;
void f(int *p)
{
p=&k;
}
void main()
{
int m=3,*p=&m;
f(p);
printf("%d,%d",m,*p);
}
#include<stdio.h>
int k=5;
void f(int *p)
{
*p=k;
}
void main()
{
int m=3,*p=&m;
f(p);
printf("%d,%d",m,*p);
}
请问这两个输出结果为什么不同?? 哈哈哈的 发表于 2019-2-3 14:33
#include
int k=5;
void f(int *p)
还是和我上面说的一样啊 *p=k 只是给指针所指的地址赋一个值 而p=&k 却是让指针指向一个新的地址
指针是活动的 而m的地址和值却是绑定的 如果指针指向m的地址 那么指针得到新的值 指针指向的地址所绑定的变量也就是m的值就会随之改变了 但如果指针指向的地址改变了 那么这个指针就和原来的地址所绑定的一切都没有任何关系了
82457097 发表于 2019-2-3 14:53
还是和我上面说的一样啊 *p=k 只是给指针所指的地址赋一个值 而p=&k 却是让指针指向一个新的地址
指针是 ...
#include<stdio.h>
int k=5;
void f(int *p)
{
p=&k;
}
void main()
{
int m=3,*p=&m;
f(p);
printf("%d,%d",m,*p);
}
这个*P输出的结果为什么是3呢?p指向k的地址,输出结果应该是5啊 哈哈哈的 发表于 2019-2-3 15:20
#include
int k=5;
void f(int *p)
这个是因为在进入f()函数时看注释
void f(int *p) //进入函数时 主函数的p将地址传给了f函数里的p 也就是相当于在
{ //p=&k;之前 有一个p=p; 然后又有p=&k;其实主函数的p指向的地址并未发生改变
p=&k; //你可以自己单步调试看一下 给f函数的p改成p1 然后查看&p,&p1,&m,&k;
} 本帖最后由 jackz007 于 2019-2-3 16:23 编辑
在计算机中,对变量的赋值、修改实际上就是通过改变该变量所占用的内存单元的内容来实现的,本题就是一个生动的体现。
由于指针 p 指向了变量 m,那么 * p 便就是变量 m 本身(注意:不是相等),于是,修改 * p 就是修改 m,为 * p 赋值就是为 m 赋值。
函数 f() 的作用是把外部(全局)变量 k 的值赋给输入参数所指向的内存地址单元,由于输入参数指向了变量 m,于是,函数 f() 所完成的操作实际上就是直接修改变量 m 的值。 jackz007 发表于 2019-2-3 16:17
在计算机中,对变量的赋值、修改实际上就是通过改变该变量所占用的内存单元的内容来实现的,本题就 ...
谢谢普及教育!!感激
页:
[1]