急求高手解决C语言问题

来源:百度知道 编辑:UC知道 时间:2024/07/01 13:56:18
1.#include <stdio.h>
#include <string.h>
void fun(char *s[],int n)
{
char *t;int i,j;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(strlen(s[i])>strlen(s[j]))
{t=s[i];s[i]=s[j];s[j]=t;}
}
main()
{
char *ss[]={"bcc","bbcc","xy","aaaacc","aabcc"};
fun(ss,5);
printf("%s,%s\n",ss[0],ss[4]);
}

子函数fun是比较字符串大小的,让字符串由小到大排序
但是为什么输出的时候是xy,aaaacc??
而不是aaaacc,xy呢?

2.定义语句int a[2][3],*p[3]
p[0]=&a[1][2]为什么对呢??
p[1]=&a以及p[0]=a为什么不对呢??

3.float a=1,*b=&a,*c=&b这个定义语句为什么不对呢??

谢谢啦~~(*^__^*) 嘻嘻……

1. 因为你比较的是字符串的长度(strlen),而不是按字典先后排列顺序。
2. p的类型是:整数的指针的数组。所以p[0]的类型是整数的指针(int*)。
a[1][2]的类型是整数(int),所以&a[1][2]的类型是一个整数的地址,等同于整数的指针(int*)。等号两边类型一致,赋值就是对的。
而&a类型是一个二维数组的地址,实际上就是int***了,
a类型是二位数组,是int**,
和p[1](int*)都不一致,所以都错了。
3. b类型是float*, 那么&b类型是float**,c类型是float*,所以类型还是不一致。

你仔细看~看~
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
第1圈循环结束的时候~i==4;
然后j=i+1;
那么请问这时候j等于多少呢~

(1) strlen()的返回值是字符串的长度,所以按你的方法当然把长度短的放在前面了
(2) p是一个指针数组,p[0]是一个指针,a[1][2]是一个整数,& 是取地址,用p[0] = &a[1][2]当然没问题了
p[1]=&a; a本身就是二维数组的首地址,再加&的话,是取地址的地址,而p[1]是指向Int型的,所以不对

p[0]=应该是对的吧,你再验证一下
(3).float a=1,*b=&a,*c=b;改成这样就应该对了