您的位置:首页 > 其它

char * 与 char [] 区别,char *[] 与 char[][]区别。字符串指针的数组与二维char数组区别。字符串常量赋予指针与字符数组区别。"字符串"等价于其首元素"字"的地址

2016-10-23 20:02 615 查看
一. char * p = “abc” 与 char a[] = "abc"这两种形式相同吗?

第一种形式 char * p:

p是一个指针变量。"abc"为一个字符串常量,代表其首字符地址。

"abc" == &a(在程序中使用字符串常量会生成一个“指向字符的常量指针(指向首字符,代表首字符地址)”,当一个字符串常量出现于一个表达式中时,表达式所使用的值就是这些字符所存储的地址,而不是这些字符本身), "abc" + 1 == &b(已经说过,此处生成一个指向字符的常量指针,因此“abc”+ 1将使此指针,指向b字符。)

我们可以将指针当做地址的别名看待。 例如 :

int a[2] = { 1, 2 };

int * p = &a[0] + 1;

得*p 等于 2.

上述代码即可验证。如果把地址当一个具体数值,+ 1后只是比原数值大一。要成为第二个元素地址,因为是int类型,也需要加四字节才对。 所以把它理解为指针,给指针加一,指针移动它所指类型字节大小个单位,所以此处加1而不是加4,指针解引用后的值也为数组第二个元素, 2的值。

所以*("abc" + 1) == b。

"abc" == &a , a为一个字符,所以a地址为一个char类型值地址,将这个地址赋予一个指向char类型指针变量p。

此时puts (p) 得到 abc。

*p == a

因为p指向字符a , 所以 p + 1指向字符 b。 *(p + 1) == b。

*(p + 1) == *("abc" + 1) 都等于b:

两种形式都给指针做加法,指针加1,则指针向后移动 所指向的类型大小 个单位,在此处char为1个字节,所以移动一个单位(但指针在别的地方或许是移动不同的单位,比如指向int类型则移动4个单位,指向int类型数组则又是一种新的情况(此时为数组指针,指向某种类型数组的指针。(数组指针则牵扯到多维数组,有篇博文有说到数组指针,指针数组,多维数组它们之间的关系)))。

第一种是指针变量,而第二种是常量指针

char * p = “abc” 与 char a[] = "abc"这两种形式是不同的,

第一种形式,字符串常量存储在一个叫“数据区“的地方(字符串常量的地址在那(即字符串在那个地方)), p是一个指针变量,p里面的内容是“abc”首字符a的地址,但p本身也是一个变量,它也有地址,p的地址在一个叫”栈“的地方,即p存储在”栈“上。

所以,p存放的只是一个地址。

但第二种情况,是声明并初始化了一个字符数组,大小为4(它也存储在”栈“上)。这里开辟了4个字节空间来存储a,b,c,还有空字符本身(是把字符串全存了)。但第一种并没有全存储字符串。字符串(第一种为字符串常量)存储在”数据区“, 第一种形式开辟了四个字节来存储指针变量p,而p里面存储的是”abc“首字符地址)。

char * mesg = "Don't"

char * copy;

copy = mesg;

由上面的分析可知这三段代码表示:字符串本身并未被复制,语句 copy = mesg 的作用是 产生指向同一个字符串的第二个指针.

char * p = "abc"; “abc”为常量,不可通过指针p修改。

char a[] = "abc"; “abc”保存在数组中,可修改。

二. char * a[2] ={"ab", "cccc"} 与 char ar[2][5] = {"ab", "cccc"}这两种形式也不同:

char ar[2][5] = {"ab", "cccc"}; 此时ar是一个二维数组,ar有两个元素,每个元素是一个包含五个char值的一维数组,相当于char数组的数组。开辟的空间是2 * 5。

a[0]相当于一个一维char数组, char "a[0]"[5] = {'a', 'b'}; 你看,上面为”ab“,但是,因为它存储在一个一维数组里,所以,一维数组里第三个元素存储空字符,第四个和第五个也闲不下来,被初始化为0.(数组只声明,里面值为随机值。数组声明时部分初始化,则未被初始化部分都被自动初始化为数字0)。

第一种形式,字符串本身也被存储在2个完整的字符数组里。

char * a[2] ={"ab", "cccc"} 此时a是一个指针数组(字符串指针的数组),数组的元素为指针。 数组并不存放字符串,它只是存放字符串的地址("ab","cccc"分别为字符串常量,存储在"数据区"(程序用来存放字符串常量的那部分内存中)。这时,并不是存在字符数组中,也就是比如"ab"只用开辟三个空间来存放三个值,a,b和空字符。而不是像上面那样开辟五个空间(一个char字符数组))。

尽管a并没有被定义成二维数组,但由于数组符号和指针之间的关系,也可以用a[0][0]表示第一个字符串的第一个字符。

可以把a[0]看作表示第一个字符串,*a[0]表示第一个字符串的第一个字符。(关于指针和数组相同点与不同点,有篇博文提到了)

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

一个是指向char的指针的数组,一个是char数组的数组。

一个存放地址,一个存放完整的字符数组。

char * p = "abc"; “abc”为常量,不可通过指针p修改。

char a[] = "abc"; “abc”保存在数组中,可修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐