C语言-指针和字符串

一)基础知识

下面两行代码有着本质的区别:

①. Char name[]=“it”;//定义的是一个字符串变量!

②. Char *name2=“it”;定义的是一个字符串常量//指针变量name2指向了字符串的首字符i

 

Char name[0]=‘y’;//改变第一个元素的值

Printf(“%s\n”,name);//打印结果为yt

 

 *name2=‘y’;

Printf(“%s\n”,name2);//此时程序崩溃

这是因为,两者一个是字符串变量,一个是字符串常量。C语言的数组元素存放于栈,里面的元素可以随便修改,称为字符串变量。而字符串常量存放于常量区,会缓存起来是不可更改的。

Char *name1=“it”;

Char *name2=“it”;

Printf(“%p %p”,name1,name2);//地址是一样的,说明name1和name2指向的是同一个字符串。

 

掌握字符串定义的两种方式:

①. 利用数组

特点:字符串里边的字符是可以修改的,适用于内容需要经常修改时。

②. 利用指针

特点:其实是一个常量字符串,里面的字符不能修改,适用于字符串的内容不需要修改,且这个字符串经常被使用时。

 指针处理字符串的注意
char *s;
s = "mj";

上面的指向方式也是正确的:先定义指针变量,再指向字符串。如果是字符数组就不允许这样做,下面的做法是错误的:

1 char s[10];
2 s = "mj";

编译器肯定报第2行的错,因为s是个常量,代表数组的首地址,不能进行赋值运算。

还需要注意的是,下面的做法也是错误的:

1 char *s = "mj";
2 
3 *s = "like";

第3行代码犯了2个错误:

  • 3行代码相当于把字符串"like"存进s指向的那一块内存空间,由第1行代码可以看出,s指向的是"mj"的首字符'm',也就是说s指向的一块char类型的存储空间,只有1个字节,要"like"存进1个字节的空间内,肯定内存溢出
  • 由第1行代码可以看出,指针s指向的是字符串常量"mj"!因此是不能再通过指针来修改字符串内容的!就算是*s = 'A'这样"看起来似乎正确"的写法也是错误的,因为s指向的一个常量字符串,不允许修改它内部的字符。
 

posted on 2015-03-04 23:01  二狗你变了  阅读(135)  评论(0)    收藏  举报

导航