指针的初始化与new

指针的初始化

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] 是一个指向字符数组的指针。

欢迎各位的讨论与指正

posted @ 2023-03-20 16:00  todayis_wendy  阅读(238)  评论(0)    收藏  举报