关于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的都是一个指针,而且这两个函数都是对形参进行的某些交换,按照平时的理解,对于形参的改变不会影响到实参,但为何程序二却实现了功能呢?非常感谢您的回答! 展开
程序一:#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的都是一个指针,而且这两个函数都是对形参进行的某些交换,按照平时的理解,对于形参的改变不会影响到实参,但为何程序二却实现了功能呢?非常感谢您的回答! 展开
展开全部
你要明白,指针变量有两个相关的值,一个是指针变量本身的内存地址,一个是该内存地址存储的数据,是另一个变量的地址。
如:
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本身的值也的确没变,但是数组元素的顺序改变了,指向的字符串当然也不同了。
如果还是不懂就画个草图,关键是 时刻把数据在内存中的存储放在心上。
如:
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本身的值也的确没变,但是数组元素的顺序改变了,指向的字符串当然也不同了。
如果还是不懂就画个草图,关键是 时刻把数据在内存中的存储放在心上。
展开全部
先说程序一
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; //所以这里是实实在在的值交换,不是地址交换
}
}
希望能帮你理解指针
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; //所以这里是实实在在的值交换,不是地址交换
}
}
希望能帮你理解指针
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
程序一
若改为int *pt;* pt=*px; *px=*py;* py=*pt;应该就交换过了。相当于远程遥控交换;而你的那种写法仅是在函数内把地址交换。。结束后原数值并没改变
若改为int *pt;* pt=*px; *px=*py;* py=*pt;应该就交换过了。相当于远程遥控交换;而你的那种写法仅是在函数内把地址交换。。结束后原数值并没改变
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询