C语言指针问题

#include<stdio.h>voidmain(){voidexchange(int*ap,int*bp,int*cp);inta,b,c,*ap,*bp,*cp;p... #include <stdio.h>

void main ()
{
void exchange(int *ap,int *bp,int *cp);
int a,b,c,*ap,*bp,*cp;

printf("请输入三个数:");
scanf("%d%d%d",&a,&b,&c);
ap=&a,bp=&b,cp=&c;
printf("\n您输入的数为:%d\t%d\t%d\n",a,b,c);
exchange(ap,bp,cp);
printf("排序后的顺序为:%d\t%d\t%d\n",*ap,*bp,*cp);
}

void exchange (int *ap,int *bp,int *cp)
{
int *swap (int *a,int *b);
swap(swap(ap,bp),cp);
}

int *swap (int *a,int *b)
{
int temp;
if (*a>*b)
temp=*a,*a=*b,*b=temp;
else ;
return a;
}
这个程序不能完成功能,函数的返回值可以是地址吗?求高手解答!
展开
 我来答
匿名用户
2012-03-24
展开全部
1.概念问题:指针是指存放地址值的变量或常量;指针与一般变量或常量的区别,在于它不直接存储数值,而是存放被存储数值的地址,属于间接存放,所以不少初学者感觉学习困难。
比如:int a=2,b,c,*ptr; ptr=&a;表示将指针ptr指向变量a,存放a的地址,假设是2000H,而指针变量ptr本身也要有地址,假设是3000H,明显 ptr和&ptr是不相等的,千万不要搞混。常见用法:ptr=&a; 指针ptr指向变量a
b=*ptr; 将ptr所指内容存入b,b=a
c=&ptr; 将ptr地址存入c,c与&a或&b明显不同

2. *问题:*在指针部分有两种用法,一是定义指针变量,比如 char *p;二是表示取指针变量所指的内容,比如char ch,*p; *p=ch;
&问题:&指取变量地址,比如 p=&ch;将指针指向ch,即p的值=ch变量的地址

3.指针与数组问题:数组的名字本身代表该数组的首地址,要区分地址与数值之间的关系,比如char c[10], *p;
(1)p=c;表示指针p指向数组c,相当于p=&c[0];c和&c[0]都是表示首地址
(2)c[0],c[1],...c[9]都是表示数组中每个具体变量的值,前面加&才是其地址,与指针相连时,一般是p=&c[1]形式,只有指向c[0]时,才能省略为p=c

4.还有一些复杂的指针应用,比如指向指针的指针,或者指向函数的指针,那些更复杂,二级考试中很复杂的一般考的不多,建议将基本的学习好;这个东西要靠自己慢慢理解,理解了,其实简单,不理解,很难,呵呵。

写了不少,希望能对你的学习有所帮助,不对的地方,请海涵!
不知详解
2012-03-24 · 知道合伙人软件行家
不知详解
知道合伙人软件行家
采纳数:609 获赞数:2251
自学计算机。

向TA提问 私信TA
展开全部
你的问题在于两次交换并不能完成排序,需要3次。
swap()返回较小的那个,并且把较小的数放在左边。所以我假设你是希望从小到大排序。
对于三个元素进行排序
#include <stdio.h>
#include <stdlib.h>
void exchange (int *ap,int *bp,int *cp)
{
int *swap (int *a,int *b);
swap(bp,cp);swap(ap,bp);//最小的数赋值给a
swap(bp,cp);//把b和c排序。
}

int *swap (int *a,int *b)
{
int temp;
if (*a>*b)
temp=*a,*a=*b,*b=temp;
else ;
return a;
}

void bubble_sort(int *x,int n);
int main ()
{

int a[3];

printf("请输入三个数:");
scanf("%d",&a[0]);
scanf("%d",&a[1]);
scanf("%d",&a[2]);

printf("\n您输入的数为:%d %d %d\n",a[0],a[1],a[2]);

exchange(&a[0],&a[1],&a[2]);
printf("排序后的顺序为:%d %d %d\n",a[0],a[1],a[2]);

system("pause");

return 0;
}
//两次交换是不能达到排序效果的。
追问
哦~~我傻了~两次调用时不可实现的~~~~~只能找出最值~~~谢谢你!!!我一直以为是我语法错误呢~不错你的程序还是不对~~输入2 1 3好像不行~~留下的我解决就行了~~语法没有错就行~谢谢你!
追答
现在对了,我改了。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lyhdez1
2012-03-24 · TA获得超过1942个赞
知道小有建树答主
回答量:687
采纳率:100%
帮助的人:828万
展开全部
函数的返回值可以是地址,但是你的这个程序貌似不需要。我帮你改了一下:
#include <stdio.h>

void main ()
{
void exchange(int *ap,int *bp,int *cp);
int a,b,c,*ap,*bp,*cp;

printf("ÇëÊäÈëÈý¸öÊý£º");
scanf("%d%d%d",&a,&b,&c);
ap=&a,bp=&b,cp=&c;
printf("\nÄúÊäÈëµÄÊýΪ£º%d\t%d\t%d\n",a,b,c);
exchange(ap,bp,cp);
printf("ÅÅÐòºóµÄ˳ÐòΪ£º%d\t%d\t%d\n",*ap,*bp,*cp);
}

void exchange (int *ap,int *bp,int *cp)
{
void swap (int *a,int *b);
swap(ap,bp);
swap(bp,cp);
}

void swap (int *a,int *b)
{
int temp;
if (*a>*b)
temp=*a,*a=*b,*b=temp;
}
追问
额~这个~我想搞懂返回值是地址这一问题~~如果改成一般的指针~我还是可以理解的~~能把返回值的是地址的问题告一下吗?或者说我程序的问题在哪里!谢谢了!!我继续加分~!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
圣诞鲨鱼
2012-03-24 · TA获得超过479个赞
知道小有建树答主
回答量:525
采纳率:0%
帮助的人:473万
展开全部
返回地址,当然可以了,返回的是swap函数的第一个参数
相当于先将输入的 a b 进行swap 返回 &a 然后再 a,c进行swap
void exchange (int *ap,int *bp,int *cp)
{
int *swap (int *a,int *b);
swap(ap,bp)
swap(bp,cp)
swap(ap,bp)
}

int *swap (int *a,int *b)
{
int temp;
if (*a>*b)
temp=*a,*a=*b,*b=temp;

return a;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友baf1f20a67
2012-03-24 · 超过13用户采纳过TA的回答
知道答主
回答量:33
采纳率:66%
帮助的人:16.4万
展开全部
你的程序逻辑就是错的。你输入*ap=3;*bp=2;*cp=3;
第一次调用swap();ap变成2,bp变成3,返回值是a,a指向的地址的值是2.
第二次调用swap();是2和1的比较,ap的值变成1,cp指向的值变成2了,
所以你按照 ap bp cp顺序输出的结果就是 1 3 2了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式