字符串(3)字符数组和指针

字符串(3)字符数组和指针

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 " ;

你可能感兴趣的:(字符串(3)字符数组和指针)