C语言指针问题

1.sss(s,t)
char *s,*t;
{ while ((*s)&&(*t)&&(*t++==*s++));
return(*s-*t);
}
A.求字符串的长度 B.比较两个字符串的大小 C。将字符串S复制到字符串t中
D。将字符串s接续到字符串t中
为什么答案是B而不是C啊?求解释
2.#include<stdio.h>
main()
{ char ch[2][5]={“6937”,"8254"},*p[2];
int i, j , s=0;
for(i=0;i<2;i++) p[i]=ch[i];
for(i=0;i<2;i++)
for(j=0;p[i][j]>'\0';j+=2)
s=10*s+p[i][j]-'0';
printf("%d\n",s);
}
A.69825 B.63825 C.6385 D.693825
求解释,怎么做的
3.下面程序的运行结果是
#include<stdio.h>
#include<string.h>
main()
{ char *p1,*p2, str[50]="abc";
p1="abc";p2="abc";
strcpy(str+1,strcat(p1,p2));
printf("%s\n",str);
}
答案是aabcabc,但是为何拿?求解释

1.
这里根本就没有赋值的语句,所以没有复制。
(*s)&&(*t)&&(*t++==*s++) 这个条件就是没到s的结束且没到t的结束且*t == *s,就循环,t和s的指针都往后移。
2.
p是指针数组,就是有两个指针
for(i=0;i<2;i++) p[i]=ch[i];这个就是赋值给p指针,其中p[0] 等于ch二维数组的第0行的首地址,p[1]等于ch二维数组的第1行的首地址
for(i=0;i<2;i++) //循环p指针数组
for(j=0;p[i][j]>'\0';j+=2) //间隔j+=2循环p[i]指向的数组,当i=0时就是ch二维数组的第0行,i=1时就是ch二维数组的第1行
s=10*s+p[i][j]-'0'; //就是ch的第i行第j列减去'0',这样要注意,这是个字符,ASCii是0x30,'6' - '0' = 0x36-0x30 = 0x06
//所以答案是6385
3.
数组变量实际上就是地址
str是这个数组的首地址,相当于&str[0]
str+1就是&str[1],
strcat(p1,p2) 返回就是把p2接在p1后就成了"abcabc
strcpy(str+1,strcat(p1,p2))就是把strcat(p1,p2)的返回复制到str+1上,就是从&str[1]开始
原来str[50]="abc";从&str[1]开始就是把b及后面的覆盖就成了aabcabc
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-04
1.sss(s,t)
char *s,*t;
{ while ((*s)&&(*t)&&(*t++==*s++)); // 如果 s 和 t 的字符相同, 则继续比较下一个
return(*s-*t); // 否则返回哪个大
}
A.求字符串的长度 B.比较两个字符串的大小 C。将字符串S复制到字符串t中
D。将字符串s接续到字符串t中
所以答案是B
2.#include<stdio.h>
main()
{ char ch[2][5]={“6937”,"8254"},*p[2];
int i, j , s=0;
for(i=0;i<2;i++) p[i]=ch[i]; //p[0]='6937'的首地址, p[1]='8254'的首地址
for(i=0;i<2;i++)
for(j=0;p[i][j]>'\0';j+=2)
s=10*s+p[i][j]-'0'; // s=6, s= 6*10+3=63, s=63*10+8=638, s=638*10+5=6385 选C
printf("%d\n",s);
}
A.69825 B.63825 C.6385 D.693825
求解释,怎么做的
3.下面程序的运行结果是
#include<stdio.h>
#include<string.h>
main()
{ char *p1,*p2, str[50]="abc";
p1="abc";p2="abc";
strcpy(str+1,strcat(p1,p2)); //p1和p2连接成 abcabc, 复制到s的第2个字符开始处, 所以s 为aabcabc
printf("%s\n",str);
}
答案是aabcabc,但是为何拿?求解释
第2个回答  2011-03-05
数组元素的一块内存区域,那么数组元素是怎么被引用的呢,我举个例子。如a[3],编译系统会首先找到这个数组的首地址,即a,然后根据〔〕中的值确定地址偏移量,即3,由此便确定了,要引用的元素是地址a+3所指向的单元的内容。你知道〔〕叫什么吗?它不只是“方括号”,在C中它的名字叫“偏址运算符”,由此可知它的作用是什么。在C++中,〔〕是可以被重载的。

明白了上面那一点后,再来看,那么指针变量p和数组名a便具有了相同的性质,即:都是一个指针。

(1)p+1,a+2,p++,p=p+1,p-a当然都是合法的了。因为它们是相同类型的量之间进行的运算。只不过,这个量不同于一般存放数据的量,它存放的是地址罢了。

(2)a++,a=a+1,a=a-1之所以非法,是因为一旦为数组分配了内存空间后,其首地址是确定的了,就相当于一个常量,常量怎么可以改变呢?

这里,你可能会有点疑惑。但我只想说一句:“对变量(或常量)的引用不等于改变这个变量(或常量)”,你好好的揣摩一下。如p-a,a-2等只是引用a的值进行计算,但a本身的值并没有改变,而a++,即a=a+1却是硬生生地尝试去改变a,你看,是这样的吗?或许换个写法你看着更直观一些,如:k=p-a与a=a-1

(3)关于它们的意思,其实我前面已经说了。既然p,a是指针,存放的是地址,那么对它们的操作当然是改变地址的运算了,如p+1就指向地址为P+1的这个内存单元,。。。。。
对于a++,a=a-1这些非法的家伙嘛,就不用多说了,它试图去改变有用的数据单元,是绝对不能容忍的,我们需要的是稳定。。。。

===================
有括号的情况下func是一个函数指针,而没括号它返回一个int指针函数。
函数指针是指向函数的指针变量。
每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。函数指针”是指向函数的指针变量,因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。

指针函数是指带指针的函数,即本质是一个函数。我们知道函数都又有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。
第3个回答  2011-03-04
1.while ((*s)&&(*t)&&(*t++==*s++))这句是表示只要两个字符串还有字符且相等的话就指针指向下一个,一直到字符串结尾,最后返回大小,(就是正,还是负)
2.2维数组也是线性的,p[i]=ch[i];所以这是把ch数组的字符赋值给了p,然后循环体内,由于数组里面是字符,如果做加减要做ascii码转换,但是 s=10*s+p[i][j]-'0';减了0字符,所以得到的是十进制的数值
3.strcat(p1,p2)是把P2接上P1的字符,得到的结果为abcabc
strcpy(str+1,strcat(p1,p2));这是复制(第二个参数赋值给第一个),然后会覆盖原字符,得到的结果为aabcabc
相似回答