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的地址了???
有点不明白,求帮助。。谢谢!
编译能通过?不应该能通过的,也可能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 这种格式化符
----------
不知能明白了否。
*pc是第一个地址.你用c%
一种语言有他自己的规则
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的值