关于C语言指针的问题,希望高手帮忙解答一下

今天看C语言时候遇到了指针的问题,希望高手帮忙解答一下:程序一:#include"stdio.h"voidmain(){inta=1,b=2;int*pa=&a,*pb=... 今天看C语言时候遇到了指针的问题,希望高手帮忙解答一下:
程序一:#include"stdio.h"
void main()
{
int a=1,b=2;
int *pa=&a,*pb=&b;
void swap(int*px,int*py);
swap(pa,pb);
printf("%d,%d",a,b);
}
void swap(int *px,int*py)
{
int *pt; pt=px; px=py; py=pt;
}
程序二:#include"stdio.h"
#include"string.h"
void main()
{
int i;
char *pname[]={"wang","li","zhang","jin","xian"};
void fsort(char *name[],int n);
fsort(pname,5);/*调用函数*/
for(i=0;i<5;i++)
printf("%s",pname[i]);}
void fsort(char *name[],int n)
{
int k,j;
char *temp;
for(k=1;k<n;k++)
for(j=0;j<n-k;j++)
if(strcmp(name[j],name[j+1])>0)
{
temp=name[j]; name[j]=name[j+1]; name[j+1]=temp;
}
}
通过运行后得知,程序一没有完成a与b的数值交换,而程序二却通过函数fsort实现了字符串从小到大的输出。我的问题就是:程序一与程序二分别传递给函数swap和fsort的都是一个指针,而且这两个函数都是对形参进行的某些交换,按照平时的理解,对于形参的改变不会影响到实参,但为何程序二却实现了功能呢?非常感谢您的回答!
展开
 我来答
百度网友38c8e98
2011-03-02 · TA获得超过2657个赞
知道小有建树答主
回答量:1131
采纳率:0%
帮助的人:574万
展开全部
你要明白,指针变量有两个相关的值,一个是指针变量本身的内存地址,一个是该内存地址存储的数据,是另一个变量的地址。
如:
int *p;//定义一个指针变量,既然是变量,它本身就有地址,还没赋值,它里面的数据不确定。
所以*p=5;是错误的,还没初始化,指向的内存地址不确定,要把5存储到哪里的内存?
指针变量名p表示的是它的值,等于另一个变量的地址。

int a;
p=&a;//将a变量的地址存储在 p变量所在的内存空间。
char *pname[]={"wang","li","zhang","jin","xian"}; 这里定义的是一个指针数组,数组的元素是一个个字符串的地址,假设是{0xaa,0xbb,0xcc,0xdd}
将数组首地址作为实参传递给形参
在调用函数里面,因为是地址传递,所以可以改变数组元素的顺序,如假设变为{0xbb,0xcc,0xaa,0xdd}
形参改变不会影响实参的值没错,pname本身的值也的确没变,但是数组元素的顺序改变了,指向的字符串当然也不同了。
如果还是不懂就画个草图,关键是 时刻把数据在内存中的存储放在心上。
lilaosi2001
2011-03-02 · TA获得超过823个赞
知道小有建树答主
回答量:296
采纳率:0%
帮助的人:356万
展开全部
先说程序一
void swap(int *px,int*py)
{
int *pt; pt=px; px=py; py=pt;//这里你仔细看,只是把指针的指向修改了,并没有修改对应的值
}
如果修改为如下代码,那么就会发送值的互换
void swap(int *px,int*py)
{
int pt; pt=*px; *px=*py; *py=pt;//这里就是在交换指针所指向地址中的值
}
下来看程序二
void fsort(char *name[],int n)//name是一个数组的首地址
{
int k,j;
char *temp;
for(k=1;k<n;k++)
for(j=0;j<n-k;j++)
if(strcmp(name[j],name[j+1])>0) //这里的name[j]其实就是name这个字符串数组的某一个元素的值
{
temp=name[j]; name[j]=name[j+1]; name[j+1]=temp; //所以这里是实实在在的值交换,不是地址交换
}
}
希望能帮你理解指针
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
woai3008
2011-03-02 · 超过15用户采纳过TA的回答
知道答主
回答量:59
采纳率:0%
帮助的人:40.8万
展开全部
程序一
若改为int *pt;* pt=*px; *px=*py;* py=*pt;应该就交换过了。相当于远程遥控交换;而你的那种写法仅是在函数内把地址交换。。结束后原数值并没改变
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式