理解C++指针(当它们指向指针时)

Ste*_*ano 11 c++ memory pointers

我想我很了解引用和指针.这是我(我想)知道的:

int i = 5; //i is a primitive type, the value is 5, i do not know the address.
int *ptr;  //a pointer to an int. i have no way if knowing the value yet.
ptr = &i;  //now i have an address for the value of i (called ptr)
*ptr = 10; //Go to the value in ptr, use it to find a location and store 10 there
Run Code Online (Sandbox Code Playgroud)

请随时评论或更正这些陈述.

现在我正试图跳转到指针数组.这是我不知道的:

char **char_ptrs = new char *[50];
Node **node_ptrs = new Node *[50];
Run Code Online (Sandbox Code Playgroud)

我的理解是我有2个指针数组,一组指向字符的指针和一个指向节点的指针.所以,如果我想设置值,我会做这样的事情:

char_ptrs[0] = new char[20];
node_ptrs[0] = new Node;
Run Code Online (Sandbox Code Playgroud)

现在我有一个指针,在我的数组的0位置,在每个相应的数组中.再次,如果我感到困惑,请随时在这里发表评论.

那么,**运营商做了什么?同样,实例化旁边的单个*是什么(*[50])?(究竟是什么叫做实例化?)

Jon*_*Jon 7

一些评论:

*ptr = 10; // Doesn't need to "go get" the value. Just overwrites it.
Run Code Online (Sandbox Code Playgroud)

也:

char **char_ptrs = new char *[50];
Node **node_ptrs = new Node *[50];
Run Code Online (Sandbox Code Playgroud)

认为你有两个数组更容易.但是,从技术上来说(就编译器而言)你所拥有的是两个指针.一个是指向(指向char的指针)的指针,另一个是指向(指向节点的指针)的指针.

通过变量的声明可以很容易地看到这一点,顺便说一下,这些声明最容易从右到左阅读:

char **char_ptrs
Run Code Online (Sandbox Code Playgroud)

从右向左阅读:char_ptrs是指向指针的指针char

在指针旁边放一个*被正确地称为取消引用该指针.由于数组在技术上不存在,因此数组上的operator []也是一个解除引用操作:arr[i]是另一种写入方式*(arr + i).要正确理解这一点,您需要熟悉指针算法.

多个连续*s:每个*取消引用它运行的表达式的结果.所以写作时:

char c = **char_ptrs;
Run Code Online (Sandbox Code Playgroud)

会发生什么:

char_ptrs是指向char的指针.取消引用它一次(对于最右边的*)获取它的值,这是一个指向char的指针.取消引用该值(对于最左边的*)依次为您提供自己的值,这是一个char.最后,c包含char_ptrs所指向的位置(换句话说,数组中的第一个指针)指向的内存中存储的char的值.

相反,如果你写,**char_ptrs = 'a';那么你正在改变该内存位置的值.


Ign*_*ams 6

**只是*两次,所以指针指针.

当放在一个类型旁边时,*左边绑定,不绑定.Saying new char *[50]实际上是new char* [50]实例化一个50的数组char*.