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;
}
这个程序不能完成功能,函数的返回值可以是地址吗?求高手解答! 展开
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;
}
这个程序不能完成功能,函数的返回值可以是地址吗?求高手解答! 展开
8个回答
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.还有一些复杂的指针应用,比如指向指针的指针,或者指向函数的指针,那些更复杂,二级考试中很复杂的一般考的不多,建议将基本的学习好;这个东西要靠自己慢慢理解,理解了,其实简单,不理解,很难,呵呵。
写了不少,希望能对你的学习有所帮助,不对的地方,请海涵!
比如: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.还有一些复杂的指针应用,比如指向指针的指针,或者指向函数的指针,那些更复杂,二级考试中很复杂的一般考的不多,建议将基本的学习好;这个东西要靠自己慢慢理解,理解了,其实简单,不理解,很难,呵呵。
写了不少,希望能对你的学习有所帮助,不对的地方,请海涵!
展开全部
你的问题在于两次交换并不能完成排序,需要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;
}
//两次交换是不能达到排序效果的。
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好像不行~~留下的我解决就行了~~语法没有错就行~谢谢你!
追答
现在对了,我改了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
函数的返回值可以是地址,但是你的这个程序貌似不需要。我帮你改了一下:
#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;
}
#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;
}
追问
额~这个~我想搞懂返回值是地址这一问题~~如果改成一般的指针~我还是可以理解的~~能把返回值的是地址的问题告一下吗?或者说我程序的问题在哪里!谢谢了!!我继续加分~!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
返回地址,当然可以了,返回的是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;
}
相当于先将输入的 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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的程序逻辑就是错的。你输入*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了
第一次调用swap();ap变成2,bp变成3,返回值是a,a指向的地址的值是2.
第二次调用swap();是2和1的比较,ap的值变成1,cp指向的值变成2了,
所以你按照 ap bp cp顺序输出的结果就是 1 3 2了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询