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”保存在数组中,可修改。
第一种形式 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”保存在数组中,可修改。
相关文章推荐
- 面试题--字符串指针与字符串数组的区别char* st="abc;与char* str[]="abc";的异同
- 数组字符串与指针字符串的区别 char s[]="***" 和char *s="***"的区别
- 指针与字符串:(const)char *p2 = "lmj";定义的是一个字符串常量!符串常量,正因为是常量,所以它内部的字符是不允许修改的。
- 访问 二维动态字符串数组 char** 数组的字符元素
- 指向字符数组的指针 char*p="abc"和char p[]="abc"的区别。
- C 语言 实现 字符串 分割 函数(返回"二维字符数组",及分割后的字符数组的长度)
- 字符数组名与字符串指针变量名的区别(转)
- 关于LinuxC/C++中字符指针char * str 与字符数组 char str []的一点小区别
- 字符串指针与字符数组的区别
- Delphi的字符(Char), 字符串(String), 字符串指针( PChar ), 字符数组 array of char
- 字符串指针与字符数组的区别
- "显微镜"下细看字符串常量初始化数组和指针
- 字符串赋值给字符指针(char *a="hello")的正确理解方式
- 关于数组与指针的应用及区别-针对字符串去左边多余的‘0’字符
- 字符串string 字符数组与指向字符串的指针pchar的区别与联系
- 函数内 声明一个字符数组和一个指向字符串数组的指针 区别
- 字符数组与指向字符串的指针的区别
- C 语言 实现 字符串 分割 函数(返回"二维字符数组",及分割后的字符数组的长度)
- 字符串指针与字符数组的区别
- C中常量字符串和字符数组的区别