指针做函数参数的问题

奋斗小青年 2011-07-19 12:57:01
看了很多资料,有的说指针做函数参数是值传递,有的是引用传递,众说纷纭。我一直自己的理解是值传递。但今天在写代码时发现个问题 比如一个这样的函数

int readstr(char *p)
{
if(NULL == p)
{
return -1;
}
spritf(p,"%s", "hello world!");
}

当调用函数时
char array[20]={0};
readstr(array);

最后array的值居然为 hello world了 这不是改变了值吗,费解啊。高手们速度来解决啊。是在Linux下编译的。到底指针啥时不可以改变值啊,啥时可以改变值啊。
...全文
482 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
奋斗小青年 2011-07-20
  • 打赏
  • 举报
回复
高手来总结下啥
bdmh 2011-07-19
  • 打赏
  • 举报
回复
传递char*,可以修改指针指向的内容
奋斗小青年 2011-07-19
  • 打赏
  • 举报
回复
只所以现在跟大家还在纠结,就是想通过与大家探讨,增加自己的见识。高手们其实可以多谈谈这方面的知识,例子也可以列举下。让那我们这些菜鸟级别的同学更快的进步吗。
奋斗小青年 2011-07-19
  • 打赏
  • 举报
回复
其实我调程序还是证实了那个问题。但是主要就是以前思维定势,swap(int* x,int * y) 实参不变的定势。 现在传个数组进去,指针所指向的地址是没变的,只是改变了数组中的值,这就是所谓的值传递。引用只所以能改变地址与值,因为引用传的就是地址。值传递就是改变值,不改变地址
ForestDB 2011-07-19
  • 打赏
  • 举报
回复

int global = 10;

void foo(int * p)
{
*p = 1; // 改变p指向的东西的内容
}

void bar(int * p)
{
p = &global; // 改变p的指向,但是其实最终都是值传递,所以出了这个函数,其实还是没有改变
}

int main()
{
int a = 20;
int * p = &a; // p指向a
foo(p); // a的值变成1
bar(p); // 执行完了之后p还是指向a
}

请理解上述代码的细微差别。
qingcairousi 2011-07-19
  • 打赏
  • 举报
回复
如果到现在还不明白,建议楼主恶补汇编下
lizhirob 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 wanyuan19890515 的回复:]
继续啊,关键什么啊,还有高手们都来发言下啊,都学习学习
[/Quote]

[Quote]#include "iostream"
using std::cout;
using std::endl;


void change(char *p);

int main(int argc, char* argv[])
{
char test[20]="yuan shi";

cout<<(int)test<<endl;
change(test);
cout<<(int)test<<endl;

return 0;
}


void change(char *p)
{
strcpy(p,"wo yao bian la ");
}
[/Quote]

运行前后
数组的地址没有变化,只是内容变了
因为地址本身的值就是个地址
就跟指针似的
指针本身就是个地址而已
所以运行前后他的值没有变
也就是所谓的按值传递啦

对于这个程序,楼主能明白吗
hzy694358 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 wanyuan19890515 的回复:]

高手们踊跃点啊 回答下我9楼的问题啊
[/Quote]
楼主你真纠结
char * cstr="";
readstr(cstr);
cstr是个常量,并没有指向个地址空间
你再去调用sprintf 会出错的
奋斗小青年 2011-07-19
  • 打赏
  • 举报
回复
继续啊,关键什么啊,还有高手们都来发言下啊,都学习学习
qq149850508 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 wanyuan19890515 的回复:]
看了很多资料,有的说指针做函数参数是值传递,有的是引用传递,众说纷纭。我一直自己的理解是值传递。但今天在写代码时发现个问题 比如一个这样的函数

int readstr(char *p)
{
if(NULL == p)
{
return -1;
}
spritf(p,"%s", "hello world!"); }

当调用函数时
c……
[/Quote]
关键在这
lizhirob 2011-07-19
  • 打赏
  • 举报
回复
[Quote=#include "iostream"
using std::cout;
using std::endl;


void change(char *p);

int main(int argc, char* argv[])
{
char test[20]="yuan shi";

cout<<(int)test<<endl;
change(test);
cout<<(int)test<<endl;

return 0;
}


void change(char *p)
{
strcpy(p,"wo yao bian la ");
}
[/Quote]

运行前后
数组的地址没有变化,只是内容变了
因为地址本身的值就是个地址
就跟指针似的
指针本身就是个地址而已
所以运行前后他的值没有变
也就是所谓的按值传递啦
奋斗小青年 2011-07-19
  • 打赏
  • 举报
回复
现在我主要的问题还是因为指针是值传递,现在却可以改变数据的值,一直疑惑不解,不知道有哪位高手可以拿点东西开导我,谢谢 O(∩_∩)O哈哈~
碎炎 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wanyuan19890515 的回复:]
int readstr(char *p)
{
if(NULL == p)
{
return -1;
}
spritf(p,"%s", "hello world!");
}

当调用函数时
char array[20]={0};
readstr(array);
那红色部分改成 char * cstr="";
readstr(cst……
[/Quote]
cstr指向了字符串常量 会报错
qingcairousi 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wanyuan19890515 的回复:]

int readstr(char *p)
{
if(NULL == p)
{
return -1;
}
spritf(p,"%s", "hello world!");
}

当调用函数时
char array[20]={0};
readstr(array);
那红色部分改成 char * cstr="";
readstr(cs……
[/Quote]
会段错误或者崩溃什么的。应该是实现相关的。
奋斗小青年 2011-07-19
  • 打赏
  • 举报
回复
高手们踊跃点啊 回答下我9楼的问题啊
赵4老师 2011-07-19
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
奋斗小青年 2011-07-19
  • 打赏
  • 举报
回复
那我9楼的疑问了?
dusibo2011 2011-07-19
  • 打赏
  • 举报
回复
你传送的是地址~~肯定改变了~
qingcairousi 2011-07-19
  • 打赏
  • 举报
回复
C++只有传值合传引用之分。传指针属于传值。
具体到你的代码。传入的p是一个地址值,这个地址上是一个char数组的首位置。而你用sprintf向这个地址写入了“hello world”。 整段代码中,array的值并没有被改变,始终是指向同一个char*数组,改变的只是这个数组的内容。
Dirk 2011-07-19
  • 打赏
  • 举报
回复
首先, int readstr(char *p),指针本身是传的副本,比如你在程序里执行了p+=1;修改的是副本的值。但是指针指向的内容是没有传递的,*p解引用将会得到具体的内容。
第二,char array[20]={0}; readstr(array); array指向数组的首地址,readstr函数的参数array也就不为空。在函数里来看,p是array的一个拷贝,指向的地方是相同的,所以将执行spritf(p,"%s", "hello world!"); 这里将会覆盖p指向的区域,也就是数组内容了。但是array还是指向那片区域的开头。
加载更多回复(16)

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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