指针的初始化
C++ 中的字符串常量存储为字符数组,返回的地址是const char[]
类型。即字符串常量被视为指向字符数组的指针,所以可以用字符串常量对char
类型的指针进行初始化。
char* p[] = {"char1", "char2", "char3"}; //数组内含有3个指针 —— 指针数组
而 C++ 中的string
类型的变量,返回的是一个string
类型的对象,如果向初始化一个string
类型的指针,应该
string str1 = "string1";
char* p_str = &str1;
string str[3] = {"string_1", "string_2", "string_3"};
string* pa_str = str;
string* pb_str = new string[3];
pb_str[0] = "string4";
pb_str[1] = "string5";
pb_str[2] = "string6";
delete [] pb_str;
强制类型转换是临时的,也就不能下面这样初始化指针:
string* a[3] = {&string("string1"), &string("string2"), &string("string3")};
因为string
对象是临时对象,其生命周期只存在于当前语句中。因此,将其地址存储在数组中可能导致指向无效的内存,从而导致未定义的行为。
new参与的初始化
string* a[3] = new string[3]; // 合法行为,每个指针依次指向数组中的string元素
char* a[3] = new char[3]; // 非法行为。
第1条语句是创建了3个指针,每个指针指向一个string
的内存地址。而第2条语句却是非法的,因为基本数据类型不能通过数组初始化,而类类型却可以。
string* a[3] = new string[3] {"string1", "string2", "string3"};
// 可以使用数组下标的形式,访问其中元素。
string* b = new string[3]; // 动态数组
b[0] = "string4";
b[1] = "string5";
b[2] = "string6";
a[0]
和a[1]
是两个指针,而b[0]
和b[1]
是b
指针的移动。
char* pa = new char[3];
char (*pb)[4] = new char[3][4];
char* pc[3];
for (int i = 0; i < 3; i++){
pc[i] = new char[N];
}
char* pc[3]
定义了一个指针数组,其中每个元素都是 char*
类型的指针。这意味着 pc
数组中的每个元素都指向一个 char
类型的内存地址,这些地址可以是任何地方。
char(*p)[4]
定义了一个指向 char
数组的指针。这意味着 pb
指针指向一个长度为 4 的 char
数组,并且指针类型为 char(*)[4]
。这个数组中的每个元素都是 char
类型的。因此,char(*pb)[4]
可以用于指向二维字符数组的第一个元素,其中每个字符串都有固定的长度 4。
总之,char* pc[3]
是一个指针数组,而 char(*pb)[4]
是一个指向字符数组的指针。
欢迎各位的讨论与指正
标签:初始化,string,pb,char,数组,new,指针 From: https://www.cnblogs.com/Wendy-day/p/17236600.html