首页新闻找找看学习计划

C 关于指针的一个小问题,求帮助!

0
悬赏园豆:5 [已解决问题] 解决于 2013-07-21 20:59

C代码如下:

#include<stdio.h>
#define a 1
int main()
{

char *pc;
pc="hello!\0";
printf("%s",*pc);//这里去掉*可以得到正确结果,但是*不是用来取值的吗?不加*应该输pc的地址,不是吗? 


   system("pause");
    }

为什么会报异常呢?编译会通过,运行的时候过一下就说“xx.exe已停止工作,windows可以联机检查该问题的解决方案”,但是把printf里的*去掉就可以,但是*是取pc指像的值的啊。。不加不就成了pc的地址了???

 

有点不明白,求帮助。。谢谢!

hexllo的主页 hexllo | 菜鸟二级 | 园豆:405
提问于:2013-06-30 17:01
< >
分享
最佳答案
0

编译能通过?不应该能通过的,也可能win下的C编译的设定不同,ubuntu 下的GCC肯定是编译通不过的 会提示 waring:

format '%s' exects argument of type 'char *' ,but argument 2 has type 'int'

指的是 格式化字符串预设定的类型是个 字符串指针,但是参数2给出是一个整形(因为字符类型也是整形) ,是不匹配的.

1、指针即地址 地址即指针

char *pc //这句是一个指针定义, * 这里的这个星号符号只是一个标记符只是说明 pc 这个变量是一个指针 不能把 * 这个星号

当成操作符。

pc 指针只能接地址 比如:x000000 这种类似的。

pc="hello!\0";// 这句 pc 里的内容并不是 "hello!\0"  这个字符串 而是 “hello!\0” 所在的地址首地址 假如 “hello!\0” 的地址是 x8888a-x88888g,7个字符就是7个地址,因为 C 中字符串在内存中存储的形式的一个字符一个地址,但它是连续性的,  pc 里存就是x8888a这个地址。

因此 printf("%s",*pc) 这句是不对的,%s 这个格式化符 需要的是一个 字符串指针 指针就是地址

去掉 * 号 printf("%s",pc)必须拿 pc中存储的地址 与 %s 这个格式化符去 匹配 才行。

当用printf("%s",) %s这个格式化符去输出字符串时 其实 也是一个字符一个字符输出的 直到遇见 \0 或者 \n 就是停止输出,

所以你看到的就是一个完整的字符串。

*pc 这种形式 中的 * 符号 是间接运算符或者叫取消指针运算符,你没有理解 * 这个运算符的意义,* 它的意思是不输出 指针本身中的值 因为 pc 中的值是一个地址 ,地址只能跟 %p %s 这样的格式化符 匹配,*pc 是去找 pc这个指针变量 中的地址中的值 就是 x8888a 这个地址中包含的值 就是 “hello!\n” 中的 h 这个字符.

所以要用 printf("%c",);%c 这种格式化符

----------

不知能明白了否。

收获园豆:4
wape.yang | 菜鸟二级 |园豆:210 | 2013-07-01 00:48
其他回答(2)
0

*pc是第一个地址.你用c%

一种语言有他自己的规则

【秦时明月】 | 园豆:760 (小虾三级) | 2013-06-30 17:30
1

printf(“%s”, 表达式e1);是要打印首地址为e1的值的字符串。

printf(“%c”, 表达式e1);是要打印e1的值所代表的字符。

你用了%s,printf就会把(*pc)的值当做字符串首地址,但是(*pc)的值是字符‘h’,函数会找到地址大小等于‘h’的内存空间开始输出,知道'\0'出现。异常的原因可能是地址值为‘h’的空间不允许用户访问或者别的什么限制

,这么输出就会出错。

要打印字符串就用printf(“%s”, pc);

也可以从第i个字符开始输出字符串用printf(“%s”, pc + i);这里注意i的值太大同样可能会有异常

要打印字符串某字符用prinf(“%c”, *(pc + i));也要控制i的值

收获园豆:1
hujichen | 园豆:203 (菜鸟二级) | 2013-06-30 18:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册