若有定义char* p="computer";则表示p的值是字符串" computer "。
不正确,这里要学习一下指针的用法
指针的本质是一块内存区域,他会指向存储数值的地方
如图所示:
指针p默认指向字符串的首地址单元.
由题意可知,p是被定义为一个字符型指针,那么作为指针它本身是并不会用于直接存储数据,而只是负责记录数据所在的内存地址,以便进行调用。
所以p的值并不是"computer",而是"computer"所在的地址。
15.下面程序段的运行结果是___. char str[]="abc\0def\0ghi",*
下面程序段的运行结果是__ef_.
char str[]="abc\0def\0ghi",*p=str;
printf("%s",p+5);
ef,p+5指向e,连续输出字符直到遇到\0
分析char str[]="abc\0def\0ghi",*p=str;这一句要拆开来看,它与下面的代码行等效:
char str[]="abc\0def\0ghi";
char *p;
p=str;
第一行:char str[]="abc\0def\0ghi"的意思是声明一个名为str的char型数组,并用字符串abc\0def\0ghi初始化(就是由编译器把这个字符串的字符一个接一个地存储到数组str中,并在最后加一个结束符'\0')。
第二行:char *p;就是声明一个指向char型变量的指针p(或叫char *型指针p)。
第三行:p=str;是将字符型数组str的第一个元素(就是a元素)的地址赋给char *型指针p。
这样,就可以通过指针p来操作数组str的内容了,比如printf("%c\n",p[1]);则会在屏幕上显示第二个字符c!
2-2.假设scanf语句执行时输入ABCDE<回车>,能使puts(s)语句正确输出ABCDE字符串的程序段是( C )。
A.char s[5]={“ABCDE”}; puts(s);
B.char s[5]={‘A’, ‘B’, ‘C’, ‘D’, ‘E’}; puts(s);
C.char *s; scanf("%s", s); puts(s);
D.char *s; s=“ABCDE”; puts(s);
解析:要正常输出ABCDE必须在字符串的末尾有’\0’作为结束,这样输出函数才知道什么时候终止。
A选项中字符串数组大小为5只能放ABCDE,放不下’\0’了。如果大小为6,会自动在后面补’\0’
B选项与A一样,放不下’\0’
C选项,楼主要知道,字符串读入进来是要存起来的,而s只是个指针,存不下这么多字符。必须是char s[6];scanf("%s",s);puts(s);
D选项是正确的,"ABCDE"作为静态常量存储于程序段,地址赋给s,可以正常输出。
以下语句或语句组中,能正确进行字符串赋值的是___D___.
A.char *sp;*sp="right!"; B.char s[10];s="right!"; C.char s[10];*s="right!"; D.char *sp="right!";
这道题选D?如果是的话说下为什么?
选d;
a中,sp是char型指针,那么*sp就是访问sp所指向的内容了,即已不再是指针.而"right!"这也是个指针,只不过是个字符串常量指针,当然就不能赋给不再是指针的*sp啦.
b中,s是个数组名,而数组名就是个常量指针,即它的值是不能改变的.所以不能用另一个常量指针"right!"来给它重新赋值;
c中,s是个常量指针,其指向数组的第0个元素即s[0],所以*s即为s[0],你觉得可以将"right!"赋给s[0]吗?
d中,sp是个刚定义的指针,然后就马上把"right!"这个常量指针值赋给了sp,所以选d了.
有以下程序: #include <stdio.h> main( ) char s[ ] ="159" , * p; p=s; printf( "% c", * p + + ); printf("%~", * p++);程序运行后的输出结果是( )。 A.15B.16C.12D.59