关于 函数指针地址传递的问题

fx397993401 2011-03-26 10:50:55

# include<stdio.h>

char gstr[10] = "123456789";

void fun1(char *str)
{
printf("%#x %#x %#x\n",&str,&str[0],&str[1]);
}
void fun2(char str[])
{
printf("%#x %#x %#x\n",&str,&str[0],&str[1]);
}
void Gfun1(char *str)
{
printf("%#x %#x %#x\n",&str,&(str[0]),&(str[1]));
}
void Gfun2(char str[])
{
printf("%#x %#x %#x\n",&str,&str[0],&str[1]);
}

int main()
{
char mstr[10] = "ABCDEFGHI";

//printf("");
printf("%#x %#x %#x\n",&mstr,&mstr[0],&mstr[1]);
fun1(mstr);
fun2(mstr);

printf("%#x %#x %#x\n",&gstr,&gstr[0],&gstr[1]);
Gfun1(gstr);
Gfun2(gstr);

return 0;
}

我是这样理解的 传递进去的指针 是具有自己的地址的 这个地址 所以在函数钟打印的第一个地址是其自己的地址
之后的是局部变量 真正的地址 全局也是一样的 各位大大 有什么看法 敬请提出
前面三个是局部变量 的地址
0xbf8238e2 0xbf8238e2 0xbf8238e3
0xbf8238d0 0xbf8238e2 0xbf8238e3
0xbf8238d0 0xbf8238e2 0xbf8238e3
后面是全局变量的地址
0x804a01c 0x804a01c 0x804a01d
0xbf8238d0 0x804a01c 0x804a01d
0xbf8238d0 0x804a01c 0x804a01d

...全文
239 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mssou 2011-11-05
  • 打赏
  • 举报
回复
有一些好像不太明白,复制了之后运行一点问题,可能是我的环境问题吧
AnYidan 2011-03-27
  • 打赏
  • 举报
回复
ansi c 中所有参数的传递都是值传递,指针也是被复制了一个临时的,只不过两者指向同一个内存位置
子达如何 2011-03-27
  • 打赏
  • 举报
回复
将代码的函数部分改一下输出,可能对LZ的理解更好:

void fun1(char *str)
{
printf("0x%p 0x%p 0x%p\n",*&str,&str[0],&str[1]);
}
void fun2(char str[])
{
printf("0x%p 0x%p 0x%p\n",*(&str),&str[0],&str[1]);
}
void Gfun1(char *str)
{
printf("0x%p 0x%p 0x%p\n",*&str,&(str[0]),&(str[1]));
}
void Gfun2(char str[])
{
printf("0x%p 0x%p 0x%p\n",*(&str),&str[0],&str[1]);
}
Lactoferrin 2011-03-26
  • 打赏
  • 举报
回复
大家复习一下赵老师语录

想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
pengzhixi 2011-03-26
  • 打赏
  • 举报
回复
额 实际上是将mstr[0]第一个元素的地址值复制进去。打印的就是这个元素的地址。
yiyefangzhou24 2011-03-26
  • 打赏
  • 举报
回复
这个还真没考虑过,我一直以为值传递是地址值的复制,但是按照你的来看为什么第一个地址会不一样?我们在被调函数中操作参数传进来的地址所指向的数据的时候,如果地址不是指向原来的操作数,那么当这个被调函数返回的时候,其实传入被调函数参数的地址所指向的数据就不会发生改变,实际上不是这样的。所以我认为地址的传递就是简单的复制。
delphiwcdj 2011-03-26
  • 打赏
  • 举报
回复
值传递可以看成复制
子达如何 2011-03-26
  • 打赏
  • 举报
回复
数组的名字本身是没有地址的,当然如果你要用&取一个数组名字的地址的话,实际上它和数组的第一个元素的地址是一致的。这就是为什么第一个输出0xbf8238e2 0xbf8238e2 0xbf8238e3(或者是全局的:0x804a01c 0x804a01c 0x804a01d)前值相同的缘故。

但是数组传递进去第一个函数之后,因为
void fun1(char *str)声明的参数是个指针,因此实参的类型信息(数组)丢失了,在函数里头只知道它是个指针了,因此第二行的前面两个值会变化了。
至于fun2的解析,我暂时记不得清楚了,反正的意思也是类型丢失了,但是为什么也丢失要查下才知道。
最后,参数传递其实大家都给谭浩强的书误导了,参数传递都是值传递的。那些什么指针传递,其实也是指针(地址)的值传递--必然导致了地址值的复制。
heartgoon2010 2011-03-26
  • 打赏
  • 举报
回复
非引用形参通过复制其对应的实参来实现初始化

69,372

社区成员

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

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