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

一.  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”保存在数组中,可修改。

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值