C++ 我是否正确理解了所有这些指针所指向的内容?

C++ 我是否正确理解了所有这些指针所指向的内容?,c++,C++,我创建了一个程序,创建了三个c字符串,然后是一个指针数组,大小与我创建的c字符串数量(3)相当,数组中的每个指针都指向三个字符串中的第一个字符,最后是指向指针数组的指针(指向数组中的第一个指针) 代码如下: int main() { char arr1 [] = "hello"; char arr2 [] = "dear"; char arr3 [] = "world"; char* p1[3]; *p1 = arr1; *(p1+1)

我创建了一个程序,创建了三个c字符串,然后是一个指针数组,大小与我创建的c字符串数量(3)相当,数组中的每个指针都指向三个字符串中的第一个字符,最后是指向指针数组的指针(指向数组中的第一个指针)

代码如下:

    int main() {
    char arr1 [] = "hello";
    char arr2 [] = "dear";
    char arr3 [] = "world";

    char* p1[3];
    *p1 = arr1;
    *(p1+1) = arr2;
    *(p1+2) = arr3;
    char** ptr = p1;
}

但是,当我执行类似于
std::cout的操作时,如果要打印指针,则应将其强制转换为void指针:

cout << (const void*) *ptr << endl;
cout您看到的“异常”与指针无关,但与
也可能相关:

正如人们所说的,你现在的问题是,你正在击中目标

ostream& operator<<(ostream& o, const char* str);
我选择10只是为了能够适应最长的字符串和一些额外的字符。这在内存中看起来像这样:

hello\0----dear\0-----world\0----
^          ^          ^
|          |          |
|          |          arr3,ptr[2]
|          arr2,ptr[1]
*ptr/ptr[0], arr1    
其中,破折号只是乱码数据,可以是任何数据,因为我们为
char p1[3][10]选择了大小为10的数据。希望图像能提供更多关于它的外观和指针的位置的信息。尽管如此,如果我们使用
malloc()
来创建此结构,我们可以用几种不同的方法来创建它,例如:

char* a = (char*)malloc(10*sizeof(char));
char* b = (char*)malloc(10*sizeof(char));
char* c = (char*)malloc(10*sizeof(char));
strcpy(a, "hello");
strcpy(b, "dear");
strcpy(c, "world");
char** ptrs = (char**)malloc(3*sizeof(char*)); //3 pointers, ie: char* ptr[3];
ptrs[0] = a;
ptrs[1] = b;
ptrs[2] = c;
这可能看起来像这样:

ptrs:---|, --|, ------|
        v    v        v
        a-\  b-----\  c----\
          v        v       v
         "hello"  "dear"  "world"

Ie:他们不会再排成长队了,但我们分配的每一件东西都会放在自己的位置上。因此,
ptrs
有指向a、b和c的指针,而它们又有指向字符串“hello”、“亲爱的”和“world”开头的指针。因此,如果我们取消引用
ptrs
*ptrs
),我们将得到一个指向
a
(a
char*
,正如我们取消引用
char**
)的指针,它是指向“hello”中第一个字母的指针。当它被发送到
cout
时,它会找到前面提到的
运算符提示:
*ptr
计算的指针是什么类型的,输出流是否有一个运算符处理这些指针?如果改为强制转换为
void*
,会发生什么情况?结果是否有所不同?
取消引用
将为您提供指针指向的对象。如果你做了
cout,它会对
char*
进行求值,那么你是对的。正如您所发现的,对于
序列,有一个
ostream
操作符重写。绘制一些图来表示指针的工作方式并理解它是非常重要的。另一方面,当您开始向分配内存的函数传递三个或四个指针时,您会发疯。另外,从Java开始一点帮助都没有:P祝你好运!因为他们认为自己能记住所有指针,但后来他们意识到自己错了:PYou的意思是
void
而不是
voif
ostream& operator<<(ostream& o, const char* str);
int main() {
char arr1 [] = "hello";
char arr2 [] = "dear";
char arr3 [] = "world";

char p1[3][10];
p1[0] = arr1; //or *(p1+1) = arr1
p1[1] = arr2; //or *(p1+2) = arr2
p1[2] = arr3; //or *(p1+3) = arr3
char** ptr = p1;
}
hello\0----dear\0-----world\0----
^          ^          ^
|          |          |
|          |          arr3,ptr[2]
|          arr2,ptr[1]
*ptr/ptr[0], arr1    
char* a = (char*)malloc(10*sizeof(char));
char* b = (char*)malloc(10*sizeof(char));
char* c = (char*)malloc(10*sizeof(char));
strcpy(a, "hello");
strcpy(b, "dear");
strcpy(c, "world");
char** ptrs = (char**)malloc(3*sizeof(char*)); //3 pointers, ie: char* ptr[3];
ptrs[0] = a;
ptrs[1] = b;
ptrs[2] = c;
ptrs:---|, --|, ------|
        v    v        v
        a-\  b-----\  c----\
          v        v       v
         "hello"  "dear"  "world"