C语言 char *p="abcde"; printf("%s",p);正确;;;char *p="abcde"; printf("%s",*p);错误,为什么啊?

如题所述

语句printf("%s",*p);会出错,因为%s表示输出字符串,而*p则是指向的字符串的第一个字符,请改成printf("%c",*p);则输出a,改成printf("%d",*p);则输出97,
原因分析:
char *p="abcde",则字符指针p指向字符串,p的值就是字符串首字符的地址,*p就是第一个字符。
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-05-28
你好,%s对应的是字符串的地址,p是指针,p的值是"abcde"的首地址。*p是一个char值就是'a'即97,显然指向内存地址为97的内存,所以就崩了。追问

a的ASCII码为97,但不一定存储在内存地址为97的内存啊?

追答

不是,因为*p值是97,所以%s会去找内存地址为97的内存。就像p有一个值,p的值是"abcde"的首地址,所以%s就能找到"abcde"

追问

你怎么知道首地址是97的呢?

追答

"abcde"的首地址不是97,char *p ="abcde",所以p指向"abcde"的首地址,也就是"abcde"的首地址保存在p里,你可以在调试模式查看p的值。*p的值是'a','a'的ascii值是97.p的值是"abcde"的首地址,所以%s就能找到"abcde"。*p的值是97,printf("%s", *p)的话,就会去找*p,也就是97的内存。

第2个回答  2015-05-28
因为这里的p是字符串abcde的首地址。而*p是指向字符串首地址的变量。输出%s即字符串当然要用首地址了

C语言 char *p="abcde"; printf("%s",p);正确;;;char *p="abcde"; pr...
语句printf("%s",*p);会出错,因为%s表示输出字符串,而*p则是指向的字符串的第一个字符,请改成printf("%c",*p);则输出a,改成printf("%d",*p);则输出97,原因分析:char *p="abcde",则字符指针p指向字符串,p的值就是字符串首字符的地址,*p就是第一个字符。

C语言 printf("%s",p)
所以用printf("%s",p);而不是printf("%s", p); 这一点必须记住。如果用%c,想输出里面的内容就可以按照正常的指针概念,用*p了。可以执行一下这一条语句char * p = "string pointer dam fucking sucks!"; printf("%s\\n%p\\n%c\\n", p, p, *p);你会发现c实际上没有string类型。那么c...

...char *p="abcdefgh"; p+=3; printf("%d\\n",strlen(strcpy(p...
首先strcpy(p,"ABCD")这句是说。将ABCD赋值个p,他们之间是怎么赋值的呢,让p指针指向“A”的地址,如果取值的话就*P拿到A了。这个函数返回的值是目标串的地址,也就是p啦,那么p是个指针怎么算地址的长度呢,其实就是strlen("ABCD")啦,为什么,计算机知道的啦,因为p指向了“ABCD”首地址了,...

设char *p="abcdABCD";,则执行printf("%s",p+4);后输出结果是
char *p="abcdABCD";printf("%s",p+4);\/\/这句话说的是把输出项以字符串的形式输出为,输出项必须是地址,这时地址是p+4,从p+4这个地址开始输了直到遇到\\0才会结束,p+4指向的是A,所以输出来是ABCD

...*p=UNLL; for(p=a;p<a+5;p++) { printf("%s\\n",p); }
,所以输出ABCDE 第二次循环时p++,p的值是数组a的第二个字母的地址,即B的地址,那么p指向字符串BCDE,所以输出BCDE 同理,依次输出 CDE DE E 如果想按你的要求输出那么%s换成%c,p改为*p即可 如果你定义char *p="abcde";printf("%s",p);printf("%s",p+1);分别输出的是abcde 和bcde ...

...="ABCDE",*p; for(p=s;p<s+5;p++)printf("%s\\n",p);}运行结果是什么...
运行结果:ABCDE BCDE CDE DE E 原因:字符指针*p,一开始是定位在字符串s[]的'A'处,所以显示是ABCDE,而循环中p++之后,每次p指针向前移动,显示的结果就是每次向前,逐一成为以上结果。希望能帮到你!

...{"ABCDE"}; char *p=a; *(p+2)+=2; printf("%s",p+1); }运行结果...
因为p+2指向a[2],然后+=2,所以a[2]的值变为E。p+1指向a[1],输出是从a[1]开始输出字符串,所以答案是 BEDE

char *p="ABCDE";p++ printf("%c"p[2])
输出结果:D。这时P的值是“BCDE”。

char*p;scanf("%s",p);为啥就是错的,int *s;scanf("%d",s);就是对...
char*p;scanf("%s",p); 还是 int *s;scanf("%d",s); 都是错的,因为没有给 p 或者 s 申请内存空间。语法上是对的,编译时可以通过,先进一点的编译器应该有警告,"使用未初始化的变量",但很可能会出现运行错误,如果不出现运行错误,就麻烦大了,scanf 改写了不属于该程序的内存。

...="ABCD",*p; for(p=s;p<s+4;p++) printf("%s",p); }
ABCD BCD CD D 数组名可以作为数组的指针。所以printf("%s",p);就是输出p所指向的内容。for循环里,p++,是将指针向后移动一个单位。这里是char型的,所以向后移动一个字节。指向‘B’。以此类推。

相似回答