朗朗空间

我知道并不是 所有鸟儿都飞翔

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  16 Posts :: 0 Stories :: 6 Comments :: 0 Trackbacks

常用链接

留言簿(1)

我参与的团队

搜索

  •  

最新随笔

最新评论

阅读排行榜

评论排行榜

2.字符数组和指针
我们可以使用指针符号建立字符串。
如:

const char *about[] = "about me!";

这个声明和下面声明的作用几乎相同:

char about[] = "about me!"

那么,这两种方式有什么不同呢?
数组形式在计算机中被分配一个有10个元素的数组。每个元素都被初始化为相应的字符。最后那个字符为\0。
通常,被引用的字符串存储在可执行文件的数据段部分;
当程序被加载到内存中时,字符串也被加载到内存中。被引用的字符串被称为位于静态存储区。
但是在程序开始运行后才为数组分配存储空间。这个时候,把被引用的字符串复制到数组中。
此后,编译器会把数组名about看作是数组首元素地址&about[0]的同义词。
但是,数组形式的about是个地址常量,您不能更改about,因为着意味着更改数组存储的位置(地址)。
可以用运算符aoubt+1来标识下一个元素,但是不能使用++about。
增量运算符只能用在变量名前,不能用在常量名前。

指针形式*about也在静态区预留10个元素的空间。
此外,一旦程序开始执行,还需要为指针变量另外预留一个存储位置。
这个变量初始化时指向字符串的第一个字符,但是它的值是可以改变的。
因此,可以对它使用增量运算符。例如,++about将指向第二个字符b。

3.数组和指针的差别

char heart[] = "I love cuicui!";
char *head[] = "I love cuicui!"

主要的差别在于数组名heart是个常量,而指针head则是个变量。
首先,两者都可以使用数组符号

for (i = 0; i < 6; i++)
{
    
putchar (heart[i]);
}
putchar ('\n');
for (i = 0; i < 6; i++)
{
    
putchar (head[i]);
}
putchar ('\n');

其次,两者都可以使用指针加法

for (i = 0; i < 6; i++)
{
    
putchar (*(heart + i));
}
putchar ('\n');
for (i = 0; i < 6; i++)
{
    
putchar (*(hed + i));
}
putchar ('\n');

但是,只有指针可以使用增量运算符

while (*(head) != '\0')
{
    
putchar (*(head++));
}

最后,不能使用以下语句

//第一种情况
heart = head//非法,常量的值不能改变
//第二种情况
head[1] = 'k';  //非法,C的标准不应该允许这样做,但少量编译器混淆了这个概念

为了防止第二种情况发生,建议的做法是在初始化一个指向字符串文字的指针时使用const修饰符:

const char * p1 = "Klingon";
posted on 2008-05-04 16:21 聂元朗 阅读(309) 评论(0)  编辑 收藏 引用 所属分类: C语言学习笔记

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理