char*和char[]区别
- 1:数据在内存中的存储
- 2:char*和 char[]分析
- 3:char* p2 和 char p1[]
- 3.1 修改指针所指向的地址
- 4: string转char*
- 5: char * 转string
- 5.1 to_string()用法
1:数据在内存中的存储
- 栈:就是在那些由编译器在需要的时候分配,在不需要的时候自动清楚变量的存储区,里面的变量通常是局部变量,函数参数等。
- 堆:就是那些由new或malloc分配的内存,在不使用的时候,要手动用 delete或free来释放内存区域
- 全局/静态存储区:全局变量和静态变量被分配到同一块内存中,他们共同占用同一块内存区域。
- 常量存储区:这是一块特殊存储区,他们里面存放的是常量,不允许修改
2:char*和 char[]分析
#include<iostream>
using namespace std;
int main()
{
char* a = "abc";
char b[] = {'a','b'};
b[0] = 'b';
a[0] = 'b';
cout <<a << " "<< endl;
}
上述代码至少会有两个问题
问题1 :
char* a = “abc”;
分析:
- 等号右边的"abc"是一个不变常量,在c++中叫做string literal,type是const char *
- a则是一个char指针。如果强行赋值会发生什么呢?没错,就是将右边的常量强制类型转换成一个指针,结果就是我们在修改一个const常量。
- 编译运行的结果会因编译器和操作系统共同决定,有的编译器会通过,有的会抛异常,就算过了也可能因为操作系统的敏感性而被杀掉。
问题2:
因为"abc"在常量存储区中保存有一份,并且任何指向该存储器的任何写操作都是非法的。
💚💚💚
#include<iostream>
using namespace std;
int main()
{
const char* a = "abc";
char b[] = {'a','b'};
b[0] = 'b';
cout <<b[0] << " "<< endl;
}
但是上述代码是没有什么问题的
可以直接输出 :b
分析
- char b[3] = {‘a’,‘b’}的字符a和b是存放在栈区的所以可以进行写操作。
- 字符’a’, ‘b’ 是在 栈中开辟一段内存,内存的大小为3字节(char数组后面自动加一个 ‘\0’),然后 ‘a’, ‘b’ 被保存在栈中。
3:char* p2 和 char p1[]
从某种意义上来说, char p 和 char p[] 是没有区别 的,比如下面的代码:*
字符数组 char p1[] 编译器会在末尾自动加上’\0’ p1 = &p1[0] ; cout << p1 ;
直接输出这个字符串,本质就是通过这个地址 char *p 定义一个指针变量p,然后打印出这个变量指向的内存保存的值。
但是 char p1[] 和 char p2 又是有区别的。*
char* p2 是指向的常量区域是不能修改的
char[] p1 由于保存在栈中,是可以修改的,比如将 p1[0] 修改成 b"
#include<iostream>
int main()
{
char p1[] = "hello java";
const char *p2 = "hello C++";
p1[0] = 'b';
std::cout << p1 << std::endl << p2 << std::endl;
std::cout << *p1 << std::endl <<p2[0] <<std::endl;
}
3.1 修改指针所指向的地址
修改p2的指,程序运行就会出错,但可以修改p2所指向的地址
#include<iostream>
int main()
{
char p1[] = "hello java";
const char *p2 = "hello C++";
// 修改指针所指向的地址
p2 = p1;
std::cout << p2 << std::endl;
std::cout << p1 << std::endl;
return 0;
}
4: string转char*
#include<iostream>
#include<cstring>
int main()
{
char t[10];
// error: 'string' was not declared in this scope
// 这里需要带上 std命名空间。
// answer :
// 如果不使用using std::string,就在程序中使用string 类型变量,程序不能识别是标准库中的string 变量。
// 因为程序自定义头文件中也可能含有string变量。所以一定要声明using std::string。这样程序里面的string类型变量就都是std标准库中的string变量了。
std::string str = "abc";
strcpy(t,str.c_str());
std::cout<< t << std::endl;
return 0;
}
5: char * 转string
#include<iostream>
#include<string>
int main()
{
char t[10] = "abc";
std::string str = t;
std::cout << str;
return 0;
}
5.1 to_string()用法
1: to_string()是标头的库函数,用于将数值(数字)转换为字符串。
原型
string to_string(numberic_value);
string:是返回类型,即函数返回一个字符串对象,其中包含字符串格式的数字值。
numbric_value:是可以为整数,浮点数,长整数,双精度数的数字。
#include <iostream>
#include <string>
using namespace std;
int main ()
{
//定义不同类型的数据类型
int intVal =12345;
float floatVal = 123.45f;
long longVal = 123456789;
//将值转换为字符串以打印
cout<<"intVal (string format) : "<<to_string (intVal) <<endl;
cout<<"floatVal (string format) : "<<to_string (floatVal) <<endl;
cout<<"floatVal (string format) : "<<to_string (longVal) <<endl;
return 0;
}
输出结果
intVal (string format) : 12345
floatVal (string format) : 123.449997
floatVal (string format) : 123456789