
请教c++字符串指针常量问题
chara[6]="TEST!";char*constpc=a;*(a+1)='c';可以正常编译执行。但是char*constpc=“TEST!";*(a+1)='c'...
char a[6] ="TEST! ";
char * const pc =a;
*(a+1)='c';
可以正常编译执行。但是
char * const pc =“TEST!";
*(a+1)='c';
可以编译,但是运行就崩掉,请问是什么原因?
上面三行和下面两行是对比关系,就是用上面三行的方式可以编译、执行,用下面两行的方式,可以编译,无法运行。 展开
char * const pc =a;
*(a+1)='c';
可以正常编译执行。但是
char * const pc =“TEST!";
*(a+1)='c';
可以编译,但是运行就崩掉,请问是什么原因?
上面三行和下面两行是对比关系,就是用上面三行的方式可以编译、执行,用下面两行的方式,可以编译,无法运行。 展开
3个回答
展开全部
bcdef";
同样str存的也是这个char数组的指针,但是cout<<str;时,也会输出abcdef
p存的是字符串首地址没错
字符串的几个不同层面的含义
1、源文件中出现的 "abc" 这样的字符串
这种叫做字符串字面常量,只在代码中有效。这种字面常量具有内部链接性,编译器会在每个编译单元内部为这个字符串分配空间存储。因为是常量,它所位于的内存空间通常是不可写的。
2、一个以 '\0' (ASCII NUL字符)结束的字符数组。或者更确切的说,一个包含了各种 ASCII 可打印字符的、以 '\0' 为结束的字符数组。这是 C 语言语义上的字符串定义,不涉及编译、链接的特性,但是 <string.h>和<stdio.h> 头文件中的诸多函数都是以次为依据进行处理的。strlen / strcpy / strdup 等函数在进行识别字符串的时候,只依照是否出现 '\0' 为判断条件。
字符数组,char CHARRAY[arraysize],是一个更低层面上的意义,它表示一块连续的、包含 char 类型元素的内存区间。其中的内容是否是合法的 ASCII 字符串,是否以 '\0' 结束,并不影响它作为一个字符数组的本质。当这个数组作为局部变量或者全局变量进行分配的时候,可以使用 sizeof 操作符得到整个数组所占据的空间。这个值与其中包含的字符串的 strlen 不必须相同,通常情况下也是不会相等的。
字符指针,char *,表示一个指向 char 类型元素的指针。对它进行解除引用得到的是单个的 char。由于 C 语言支持指针算术运算(对 char *p 支持 ++p; --p; p + 2 等操作),可以通过一个 char * 方便地访问连续范围的字符串,因此通常使用 char * 来引用一个逻辑意义上的字符串。
同样str存的也是这个char数组的指针,但是cout<<str;时,也会输出abcdef
p存的是字符串首地址没错
字符串的几个不同层面的含义
1、源文件中出现的 "abc" 这样的字符串
这种叫做字符串字面常量,只在代码中有效。这种字面常量具有内部链接性,编译器会在每个编译单元内部为这个字符串分配空间存储。因为是常量,它所位于的内存空间通常是不可写的。
2、一个以 '\0' (ASCII NUL字符)结束的字符数组。或者更确切的说,一个包含了各种 ASCII 可打印字符的、以 '\0' 为结束的字符数组。这是 C 语言语义上的字符串定义,不涉及编译、链接的特性,但是 <string.h>和<stdio.h> 头文件中的诸多函数都是以次为依据进行处理的。strlen / strcpy / strdup 等函数在进行识别字符串的时候,只依照是否出现 '\0' 为判断条件。
字符数组,char CHARRAY[arraysize],是一个更低层面上的意义,它表示一块连续的、包含 char 类型元素的内存区间。其中的内容是否是合法的 ASCII 字符串,是否以 '\0' 结束,并不影响它作为一个字符数组的本质。当这个数组作为局部变量或者全局变量进行分配的时候,可以使用 sizeof 操作符得到整个数组所占据的空间。这个值与其中包含的字符串的 strlen 不必须相同,通常情况下也是不会相等的。
字符指针,char *,表示一个指向 char 类型元素的指针。对它进行解除引用得到的是单个的 char。由于 C 语言支持指针算术运算(对 char *p 支持 ++p; --p; p + 2 等操作),可以通过一个 char * 方便地访问连续范围的字符串,因此通常使用 char * 来引用一个逻辑意义上的字符串。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询