C语言指针问题!总觉得p改变了

2529299417 2016-09-06 06:48:32
#include <stdio.h>
void sp(int *a)//这里传入的是p
{
int b=2;
a=&b; //这里赋值的时候,是不是改变了p的指向?为什么?
*a=*a*2;
printf("%d,",*a);
}
main()
{
int k=3,*p=&k;
sp(p);//这是按地址传递吗?它传到形参a时会产生一个与它一样的临时指针变量吗?
printf("%d,%d\n",k,*p);
}
看了一天了,希望大神指点迷津
...全文
147 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooolinux 2016-09-06
  • 打赏
  • 举报
回复
参考: 《深入理解C指针》
ooolinux 2016-09-06
  • 打赏
  • 举报
回复
传引用,形参是实参的别名。 否则,都是传值,形参是函数内一个局部变量,实参拷贝给形参,形参改变后不影响实参。 参考swap函数。
paschen 2016-09-06
  • 打赏
  • 举报
回复
引用 6 楼 visiual的回复:
[quote=引用 5 楼 paschen 的回复:] 要改指针的值,要传入指针的指针
这个程序的输出是4,3,3,如果我注释掉int b=2;a=&b;输出是6,6,6,我觉得这时候,a作为一个临时变量,它与p指向的内容是相同的,对它的内容操作就改变了*p,k也改变了,这样理解对不对? [/quote] 注释掉a=&b,后面那句*a将会修改到p指向的值(也即k或者是*p)
  • 打赏
  • 举报
回复
你记住实型,整形,字符型变量是单向值传递,如果是数组的话指针P指向的数据才会改变。
2529299417 2016-09-06
  • 打赏
  • 举报
回复
引用 5 楼 paschen 的回复:
要改指针的值,要传入指针的指针
这个程序的输出是4,3,3,如果我注释掉int b=2;a=&b;输出是6,6,6,我觉得这时候,a作为一个临时变量,它与p指向的内容是相同的,对它的内容操作就改变了*p,k也改变了,这样理解对不对?
paschen 2016-09-06
  • 打赏
  • 举报
回复
要改指针的值,要传入指针的指针
paschen 2016-09-06
  • 打赏
  • 举报
回复
a=&b 没有改变p的值,你的函数是按值传递的,也就是传过来的只是一个复制品,你改也只是在改复制品
dustpg 2016-09-06
  • 打赏
  • 举报
回复
“这个p的副本,假设是p1”, 不用假定p1, 就是sp的参数a. 本质肯定差不多, 要么压入栈, 要么用寄存器传递, 要么被内联优化掉了, 可以尝试看一下汇编代码. 不需要懂汇编, 然后分别传递int k的值,与地址,看看生成的代码区别
2529299417 2016-09-06
  • 打赏
  • 举报
回复
引用 1 楼 dustpg 的回复:
sp(p)传了p的值...可以认为是传递了一个p的副本 sp函数里面修改了p的副本, 没有修改p本身, 要修改p本身就要传递p的地址. 想象一下:
    int k = 3;
    sp(&k);
这样也是完全合法的
这个p的副本,假设是p1,相当于设置了两个不同名的指针变量但都指向了k,在函数中p1指向了b,接着有改变了它的内容,整个过程与p无关是吗?我还想知道的是这个地址传递和值传递的本质是一样的吗?都是要创建临时副本?“假设注释掉int b=2;和a=&b;这样以来p1和p所指的内容是相同的,表面上改变了p1,实际上也p改变了,是不是?
dustpg 2016-09-06
  • 打赏
  • 举报
回复
sp(p)传了p的值...可以认为是传递了一个p的副本 sp函数里面修改了p的副本, 没有修改p本身, 要修改p本身就要传递p的地址. 想象一下:
    int k = 3;
    sp(&k);
这样也是完全合法的

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧