在学习c语言指针的时候,往往会碰到这两者等价写法:
char *message="hello world!"; //我一开始以为是把数据赋值给*message
========================
char *message;
message ="Hello world!"; //但是,看了这样的写法后,感觉很困惑了。
经过百度查找资料,反复运行demo,我的理解是这样的:
不论上面的写法,还是下面的写法,实际上是让message这个变量指向"hello world!" 常量的地址。
但是,那能不能写成,下面这样呢?
char *message;
*message ="Hello world!";
我认为是不可以的,应该会报错,至少是不安全的,因为这个指针没有初始化,就开始,使用了。我在我的ubuntu操作系统上,进行gcc编译,果然发出警告了。虽然编译通过,但是运行后,果然报错,这是符合我预期的。
但是,下面的
int *i;
*i=12;
居然能编译过(没有警告),而且能运行正常,我就真的迷糊了,我觉得应该警告,而且运行会报错的,可是,不是我预想的这样,这是怎么回事哦?
<ol>
<li>C语言中没有特定的字符串类型,故通常是将字符串放在一个字符数组中,用一个字符指针,作为这个字符串的引用,指向这个数组的第一个字符。</li>
<li>字符数组的结束,必须加上'\0',否则,输出字符串时,后继会出现"垃圾"。</li>
<li>虽然,汉字字符占2个字节,而C语言只认ASCII,但输出过程会进行双字节识别,显示出正确的中文。</li>
<li>既然楼主已经声明 message 为字符指针,那麽要将一个字符数组"Hello World!"的地址赋予 message,就应当写成:</li>
message = "Hollo World!";
应当去掉 message 前面的星号。
注: int *i; *i=12; 的操作,是将整型指针 i 所指的内存的数值改成 12,指针的指向不变。
验证代码:
#include <stdio.h>
int main(){
char *open="开源中国";
char *message;
char s[]={'H','e','l','l','o',',','W','o','r','l','d','!','\0'};
char gar[]={'O','K'};
char *garbage=gar;
char *str;
str = "http://c.biancheng.net";
message=s;
printf("%s\n",open);
printf("%s\n", message);
printf("%s\n", str);
printf("%s\n", message);
printf("输出 OK 之后,估计还会有多余的字符信息(垃圾) %s\n", garbage);
}
输出:
开源中国
Hello,World!
http://c.biancheng.net
Hello,World!
输出 OK 之后,估计还会有多余的字符信息(垃圾) OKHello,World!
<pre>
int *i; *i=12;
指针i没有初始化,里面的地址是未知的,他只是刚好没有崩溃而已,并不是没有错误。
*message ="Hello world!"; 这句报的是类型错误,*message 是字符(char),"Hello world!"是字符串(char*),类型不同,所以报错,并不是检测到未初始化的指针。改成 *message = 'H'; 就不报错了。
两段代码都没有初始化指针,运行崩溃是正常情况,没有崩溃只是指针指向的内存刚好是可以写入的。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。