C语言2个小题,请教

来源:百度知道 编辑:UC知道 时间:2024/06/14 16:34:41
问题一:执行以下程序后,a.b的值分别为
main()
{ inta,b k=4,m=6,*p1=&k,*p2=&m;
a=p1==&m;
b=(*p1)/(*p2)+7;
printf("a=%d\n",a);
printf("b=%d\n",b);} 答案是0,7
对于这道题,b自然是很容易得到的,但是a我得6得不到0,我想原因就出在a=p1==&m; 对于 a=p1==&m;请讲解下。
问题二:
void sort(inta[],intn)
{int i,j,t;
for(i=1;i<n-1;i++)
for(j=i+1;i<n;j++)
if(a[i]<a[j]){t=a[i],a[j]=a[j],t=a[j];}}
main()
{ intaa[10]={1,2,3,4,5,6,7,8,9,10},i;
sort(&aa[3],5);
for(j=0;i<10;i++)
printf("%d",aa[i]);
printf("\n");} 答案是1,2,3,8,7,6,5,4,9,10
答案说什么实参传入形参是“值传输”,说调用函数不能改变实参指针变量的值,只能改变指针变量所知变量的值。对于这道题目答案值说了一句话~~~~~我确实不懂。
另外个人见解&aa[3],不是代表aa[]中第4第一个元素的地址吗?才一个元素怎么可能达到排序效果,是不是&aa[3],有错哦,个人意见应该改成(aa[10],5)才对,请大家指点。

a=p1==&m;
即a=(p1==&m);
(p1==&m)这个表达式为假,所以a=0;

看来你是才学不久
&aa[3]确实是代表aa[]中第4第一个元素的地址
看题中sort(int a[],int n)函数是对从地址a开始的5个元素进行排序,
也即题中的45678这几个数

值传递的意思就相当于赋值,题中即把&aa[3]的值赋给a,这样a就可以操作数组aa里的元素了

问题一:
a = p1 == &m
总的是个给a赋值的语句,先执行平 p1 == &m 的判断,因为两者不相等,所以结果是假,在c中,用 0 表示假,所以 a = 0;
问题二:
void sort(int a[],int n)
函数声明成以上形式,传入的实际上一个指针和一个整数。在函数内部,把指针指向的元素当成数组的第一个元素,而数组的长度是由n来确定的,所以,传入aa[3]后,指针指向主函数中数组aa的第四个元素,也就是4,从而对4以后的5个数字进行由大到小的排序

问题一:
*p1=&k;*p2=&m; a=p1==&m; p1的值应该和&k相同,所以p1==&m的比较结果是0,这里的问题估计你是手误.

问题二:
void sort(int a[],int n)
这里的说明和上楼的相同,int a[]作为参数就是地址的意思,
要是你想对ss[0]~ss[10]排序应该怎么写呢,sort(&ss[0],10)
或者 sort(ss,10),&ss[0]=ss.
要是排序起始元素不是数组的第一个元素,如要对ss[2]~ss[8]进行排序,那么应该写成sort(&s[2],8).

问题1
a=p1==&m;
根据运算符优先级,=是最后的,所以先计算p1==&m,由于p1和&m不相等,即不是同一个地址,所以a被赋值为0
=和==这个问题要引起足够的重视,实际编程时很资深程序员有时也会犯这样的错误,这样的问题是很不容易发现和定位的。例如if(a = 1)和if(a == 1)编译器是不会检查这样的错误的,当