C语言习题集合(指针)
13.解析:A.不等价的原因在于后一组语句“char*s;*s="girl";”,其中s是指针变量,在
引用一个指针变量之前,应对其赋一个初值,即将一个字符串的地址赋给它。指针变量前不加“*”,代表地址;加“*”代表该地址对应的字符,本题中“*s="girl"”语句的目的是给该指针赋初值(地址),故应该去掉s前的“*”,两组语句方等价。B.的错误在于后一组语句“chars[10];s[10]={"girl"};”数组可以在定义的同时赋初值,或者通过strcpy函数赋值,但绝对不可以使用赋值语句赋值。D.的错误在于后一组语句“chars[4]=t[4]="boy";”,C语言规定在对多个变量赋以同一个值时,不可以使用连等的方式,必须分别赋值。
20.解析:对于scanf语句,格式符后的参数应该为一个变量的地址。本题中:A.的错误
在于s已经为数组名,数组名代表一片连续单元的起始地址,不应该再加取地址符&;B的错误在于s为指针变量,一个指针变量在使用时,必须先赋一个地址值,否则,会任意指向一个存储单元,可能会造成本程序、其他程序以及整个系统的崩溃。D.的错误在于t[2]是一个数组元素,是一个数值,而不是存储该数值的单元的地址值,所以,应该加上取地址符。
24.解析:strcat函数的形式“strcat(参数1,参数2);”其中参数1可以为数组名,参数2
可以为数组名或指向字符的指针。该函数要求作为参数1的字符数组必须足够大,以便容纳连接后的新字符串。故:A.的错误在于s的长度小于参数2的字符数组t的长度;B.的错误在于作为参数1的字符数组s未赋初值,里面存放的是不确定的字符串,使第二个字符串不能确定连接到字符串1中的位置。D.中的参数1是个指针,而之所以参数1不可以为指针的原因在于“char*s="12345";”相当于“chars[]="12345";”确定了s的长度;显然,其长度不足以容纳连接两串后的新串。
29.解析:数组名不能进行自加运算,没有意义。而加、减运算也需要在数组范围内进行,
一旦超出范围,也没有意义。
30.解析:s是字符数组名,它里面存储的是一串字符。对字符串赋值的时候,可以通过定
义的同时赋初值,或者使用strcpy函数,绝对不可以使用赋值语句。即:chars[6];
这是错误的赋值方式s="abcd";
chars[6];
strcpy(s,"abcd");
这是正确的赋值方式或者直接这样:
chars[6]="abcd";
对于指针则可以通过赋值语句赋值,因为它赋的是一个字符串的首地址。
32.解析:要想按照本题要求“每传递三个字符后再存放一个空格”,需要经过这样的两步
方可以:第一,统计原字符串s,每隔3位截取下来,赋给另一个字符数串,这需要做个循环即可;第二,要考虑到是不是每次截取下来的字符串都添加一个空格,因为最后一次截取下来的字符不需再加空格,那么加一个判断语句:是否上一个循环真的循环了4次即可。注意上一个循环体的循环判断语句“j<=3&&*p”,说明该循环体可以因“j=4”或者“字符串结束*p='\0'”而终止循环。“j=4”的情况是意味着每截取3位,添加一个空格;*p='\0'意味着判断到字符串的尾部,不许再加空格,同时,包括外围的while也终止循环。
33.解析:八进制数转换为十进制数的方法是:位权展开法
(每一位的数值乘以它的权值即
C语言习题集合(指针)
8n)。由于本题中把八进制数定义为字符串的形式,所以需要将其从字符转换到整型数,即通过字符间的“减”运算。如:'7'-'0'=7。
二.填空题答案1.答案:【1】p【2】*p2.答案:【1】char*p,c;【2】scanf("%c",&c);或者c=getchar();【3】p=&c;3.答案:(2)266
(1)166
解析:第一步.调用fun函数之前,进行了如下图7-1所示的操作:全局变量p指向
图7-1
p
main函数中的局部变量y。
第二步:当发生函数调用时,实参向形参传递。这时,新开辟了整型变量x和指向main中的变量y的指针y,显然,它和全局变量p一样指向了同一个单元。fun函数中的x、y和main中的x、y是两个不同的变量,为了清晰的表示调用过程,图7-2用x'、y'代替fun中的x、y。
第三步:执行fun函数。按顺序先进行两个赋值运算:“(1)*p=*y'+z';(2)
p
图7-2
x'=*p-z';”,这时候,没有改变p的指向,而是改变了p所指向变量y(main中的变量y)的数值,即“*p=*y'+z';”等价与“y=y+z';”,故main中的变量y等于6;同时,因为*p的值改变,fun函数的形参x'的值因执行“x'=*p-z';”语句而变为2。该过程如图7-3所示。然后接着执行一个打印输出语句“printf("(2)%d%d%d\n",x',*y',*p);”,所以,该步的输出结果应为:(2)266