指针地址传递问题,求解答

秋风十里 2015-09-28 09:18:32
# include<stdio.h>

int main(void)
{
int i = 6;
int j = 8;


printf("地址:%p\n",&i);
printf("地址:%p\n",&j);


f(&i,&j);

printf("i = %d\tj = %d\t",i,j);

return 0;
}
int f(int * p,int * q)
{
int * t;
*t = *p;
*p = *q;
*q = *t;

return 0;
}
在被调函数里面建立临时指,返回时还是p和q的地址,互换还是地址里面的值。为什么在编译没出错,在执行后会程序错误无法执行。
...全文
197 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
linux_hsylar 2015-10-01
  • 打赏
  • 举报
回复
这个说明指针不够熟悉,你把i,j的二级指针传进f函数就OK了
gh_99 2015-10-01
  • 打赏
  • 举报
回复
引用 楼主 qq_23833037 的回复:
# include<stdio.h> int main(void) { int i = 6; int j = 8; printf("地址:%p\n",&i); printf("地址:%p\n",&j); f(&i,&j); printf("i = %d\tj = %d\t",i,j); return 0; } int f(int * p,int * q) { int * t; *t = *p; *p = *q; *q = *t; return 0; } 在被调函数里面建立临时指,返回时还是p和q的地址,互换还是地址里面的值。为什么在编译没出错,在执行后会程序错误无法执行。
参考代码如下:

#include<stdio.h>

int f(int * p,int * q);

int main(void)
{
	int i = 6;
	int j = 8;	
	int *ii,*jj,*t;
	ii = &i;
	jj = &j;
   printf("i地址:%p,ii地址:%p\n",&i,ii);
   printf("j地址:%p,jj地址:%p\n",&j,jj);

   f(&i,&j);
   printf("f(&i,&j);调用后i = %d\tj = %d\n",i,j);

   f(ii,jj);
   printf("f(ii,jj);调用后ii = %d\tjj = %d\n",*ii,*jj);
   //交换地址 
   t = ii;
   ii = jj;
   jj = t;
   printf("main函数中处理后ii = %d\tjj = %d\n",*ii,*jj);

   return 0;
}

int f(int * p,int * q)
{
int * t;
t = p;
p = q;
q = t;

return 0;
}
zhanghuayi_xiyou 2015-09-30
  • 打赏
  • 举报
回复
int f(int * p,int * q) { int * t; // 指针用的时候要有指向的地址才能用,这里只有声明,没有具体指向的空间,随机乱涂乱画可不行啊
赵4老师 2015-09-29
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
leee7338 2015-09-29
  • 打赏
  • 举报
回复
int* t直接拿来用是不行的,要先初始化。 int *t=p; *p = *q; *q = *t;
leee7338 2015-09-29
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
用过,就是越往里看越看不懂。
yajuie 2015-09-28
  • 打赏
  • 举报
回复
个人感觉,程序错误在没声明函数,这个代码应该能编译,
lm_whales 2015-09-28
  • 打赏
  • 举报
回复
从完全的意义上说,没有。从一定角度来说,勉强可以有
sdghchj 2015-09-28
  • 打赏
  • 举报
回复
有的错是“编译时错”,有的错是“运行时错”,我也想知道世界上有没有编译时就能知道运行时错的神编译器!
二班的码农 2015-09-28
  • 打赏
  • 举报
回复
int * t; 此时t为一个野指针,没有为其开辟空间,其指向的地址是不确定的,对其访问很危险。 将 int * t; *t = *p; *p = *q; *q = *t; 改成 int t; t = *p; *p = *q; *q = t; 就好了

69,371

社区成员

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

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