常量字符串,字符串变量——存储位置
2017-06-30 20:20
225 查看
注意:
指针方式创建的字符数组,是常量字符串,指针指向的内容是没法更改的;方括号([])方式创建的字符数组仅仅是变量,内容可以更改。
sizeof会计入‘\0’,strlen不会
参见另外一篇博客:http://blog.csdn.net/bxw1992/article/details/77193787
#include<iostream>
using namespace std;
int a = 0; //全局初始化区(data段)
char *p1; //全局未初始化区(bss段)
int main()
{
int b; //栈
char s[] = "abc"; //栈,s是字符串变量,后面带 \0
char *p2; //栈
char *p3 = "123456"; //123456\0在常量区,p3在栈上,p3是常量指针,指向的内容不能更改
static int c = 0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
cout << p3[0] << endl;
s[0] = 'd'; //正确
p3[0] = '2'; //赋值出错
system("pause");
return 0;
}
指针方式创建的字符数组,是常量字符串,指针指向的内容是没法更改的;方括号([])方式创建的字符数组仅仅是变量,内容可以更改。
string 对象没有 ‘\0’
char text[] 字符串数组若没有 '\0',只能当做数组处理,若有 '\0',可以看做字符串,可以cou<<text,否则不可以。
字符串数组
用字符串初始化字符数组时,或是char型指针指向字符串时,"\0"附带在后面与前面的字符一起作为字符数组的元素。
在内存中,就是根据"\0"来确认字符串,如果找不到就会沿着字符一直找下去。它占用内存空间,但是不计入串长。
用字符串初始化字符数组时,系统会在字符数组的末尾自动加上一个字符"\0",因此数组的大小比字符串中实际字符的个数大。如:sizeof(str1)=strlen(str1) +1;
sizeof会计入‘\0’,strlen不会参见另外一篇博客:http://blog.csdn.net/bxw1992/article/details/77193787
#include<iostream>
using namespace std;
int a = 0; //全局初始化区(data段)
char *p1; //全局未初始化区(bss段)
int main()
{
int b; //栈
char s[] = "abc"; //栈,s是字符串变量,后面带 \0
char *p2; //栈
char *p3 = "123456"; //123456\0在常量区,p3在栈上,p3是常量指针,指向的内容不能更改
static int c = 0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
cout << p3[0] << endl;
s[0] = 'd'; //正确
p3[0] = '2'; //赋值出错
system("pause");
return 0;
}
相关文章推荐
- 变量,常量,静态变量存储的位置
- 变量,常量,静态变量存储的位置
- 变量 常量等存储位置
- 变量、常量、静态变量的存储位置
- 变量,常量,静态变量存储的位置
- 变量,常量,静态变量存储的位置
- JVM学习(2)-Java常量,变量,对象(字面量)在内存中的存储位置
- 字符串存储位置
- 变量和值在内存中的存储位置
- (转载)未结束的字符串常量:C++堆、栈、自由存储区、全局/静态存储区和常量存储区
- 常量字符串与静态存储区的故事
- 常量字符串存储与销毁引发的误解
- 常量字符串为什么位于静态存储区?
- c89 中的变量生存期,作用域,存储位置总结
- 有关常量字符串和静态存储区
- 变量、常量、字符串
- 变量和值在内存中的存储位置
- 常量字符串为什么位于静态存储区?
- 变量的存储位置和程序的效率问题
- Java变量在JVM中存储位置简析