Chinaunix首页 | 论坛 | 博客
  • 博客访问: 531806
  • 博文数量: 118
  • 博客积分: 3995
  • 博客等级: 中校
  • 技术积分: 1276
  • 用 户 组: 普通用户
  • 注册时间: 2005-11-15 12:15
文章分类

全部博文(118)

文章存档

2014年(1)

2013年(1)

2010年(6)

2009年(27)

2008年(10)

2007年(33)

2006年(38)

2005年(2)

我的朋友

分类:

2007-10-24 20:49:06

C语言里定义一个字符串可以使用指针也可以使用数组,如:
(1) char *s="hello";
(2) char s[]="hello";
 
两者的区别是
(1)定义的字符串在程序里不能被修改,因为它存放在代码段内;
(2)定义的字符串可被修改,它存放在数据段或者栈内。

这两种定义字符串的方法在函数内部和外部稍有区别

*函数外部:
(1) char *s="hello";  /*定义了指针s(数据段)和常量字符串"hello"(数据段),s的值为字符串首地址*/
(2) char s[]="hello";  /*定义了字符数组s,数组内容为"hello"(代码段),注意这里s只是一个符号而不是变量实体*/

*函数内部:
如果在函数内部使用(1),(2)定义,则"hello"字符串本身存放在代码段,当函数被调用时,
(1) 仅把字符串"hello"的首地址地址赋给s
(2) 把字符串"hello"拷贝一份放到栈内,把拷贝串的首地址赋给s

所以(1)中s所指的内容不能改变,而(2)中s所指的串可修改,s指向的是"hello"串的拷贝,不会影响原串,每次调用函数的时候都拷贝一次

注:在函数内部使用(1)(2)是没有加static关键字修饰的,如果加了static关键字,那就跟在函数外部没什么区别了.
 
 
******************************
(1)稍加改变就能满足"hello"串可修改
char *s = (char []){"hello"};
 
此时匿名"hello"串存放在数据段。
也可以给定义一个匿名数组赋给int型指针,如:
int *p=(int [10]){[0 ... 9]=0};
******************************
阅读(1206) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~