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

C语言指针的赋值问题
int*p;p为指针,地址是未知的,如果直接赋值 p=a;这样编译可以通过,但是会产生警告,p的地址是随机分配的,这样对未知的地址赋值很危险,可能会覆盖掉某些重要数据,所以避免这种危险,在定义指针时注意初始化,也就是赋值。可以int*p=&a;或者int*p;p=&a;然后再对p进行操作 有错。注意大小写,还...

C语言指针问题?
调用结束后,所有实际参数的值均不会发生变化。但是swap3中*pa,*pb发生的交换(实际就是主函数中a和b的值发生了交换)

C语言中的指针问题到底是怎么回事~
指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。 指针所指向的内存区和指针所指向的...

c语言指针的赋值问题
在C语言中,指针的赋值是通过将变量的地址赋给指针变量来实现的。指针的基本概念 在C语言中,指针是一个变量,其特殊之处在于它存储的是其他变量的地址,而不是值本身。指针使我们能够间接地访问和修改变量的值。指针的赋值过程 当我们为指针变量赋值时,实际上是将其指向一个变量的内存地址赋给它。这...

c语言 指针问题 有点看不懂 能帮忙解答一下正确答案中的 每一步运算...
,’x’,4}, 把t中的字符a,字符b,字符x 赋给结构体中char a[3]; 4赋给结构体 int num,然后定义了一个指针变量 int *p=&t ,指针p指向结构体变量t,要调用结构体中的成员变量,有三种方法;t.成员名(如 t.num)(*p).成员名(如(*p).num)p->成员名(如 p->num)答案为B ...

c语言,指针指向另一个指针的问题,为什么报错?
图中红色框内代码有误,*(p+5)不是表示指针而是值。应改为 q = p+5 另外补充说明,改成这样虽然没有语法错误,但是很明显p+5已经超过数组a的内存空间,需要注意。

c语言程序指针问题
1、指针赋值带来的内存丢失在C语言中指针之间是可以相互赋值的,但是使用不当可能会造成部分内存的“丢失” ,即这部分内存空间不能再被该任何程序访问。如: main(){float *a, *b;a=(float)malloc( sizeof( float));b=(float)malloc( ...

C语言指针问题
一、如有定义char y[4]= "321"则表达式 *y+2的值是'5' 。分析:y是字符串数组首元素'3'的地址,*y的值就是字符'3',再加上2,就是字符'5'(也可以说是字符'5'的ASC码值)。二、 如有定义char z[2][4]={"MAT", "LAB"};,则表达式*(*z+2)的值是 'T'。分析:z是二维字符...

c语言问题,关于指针的问题
一、比如我们定义一个int型指针变量。int *p=NULL;初值为空。那么当执行while(p);时,只有p==NULL时,while循环才会结束。所以如果我们写while(p);printf。。。;那么只有当p为空时,后面的printf才会执行。否则就一直循环,这样我们就能判断p为空了。同理!p,自然就能判断p不为空了。二、p...

C语言指针问题
假如 P 是指针 那么 *p 就代表变量。 而&a是地址, *p=&a 就是把地址给变量,当然不正确了,因为地址只能给指针。p2,*p1都是变量,变量之间互相赋值是正确的。“原因是被赋值的指针变量前不能再加*说明符”这句话的意思是:如果 给 指针P加上“*”,那么它就变成 了变量,代表的意义...

相似回答