C++ 字符*注释[]的混淆={quot;Ab";,“F”、“B”、“Gb”、“D”};和char**

C++ 字符*注释[]的混淆={quot;Ab";,“F”、“B”、“Gb”、“D”};和char**,c++,pointers,C++,Pointers,我真的很困惑这种类型的指针定义: char *notes[] = {"Ab", "F#", "B", "Gb", "D"};`. 我知道notes这里有一个指向char的指针数组,我认为notes的元素应该都是char类型变量的地址。我错在哪里?那么这是如何工作的呢 #include<iostream> #include<string> using namespace std; int main() { char *notes[] = {"Ab", "F#

我真的很困惑这种类型的指针定义:

char *notes[] = {"Ab", "F#", "B", "Gb", "D"};`. 
我知道
notes
这里有一个指向char的指针数组,我认为notes的元素应该都是char类型变量的地址。我错在哪里?那么这是如何工作的呢

#include<iostream>
#include<string>

using namespace std;

int main()
{
    char *notes[] = {"Ab", "F#", "B", "Gb", "D"};
    cout << *(char**)(notes+2);
}
#包括
#包括
使用名称空间std;
int main()
{
char*notes[]={“Ab”、“F#”、“B”、“Gb”、“D”};
你的陈述:

char*nodes[]
表示
nodes[]
是指向
char

不完全正确。
char*nodes[]
意味着
nodes
是一个字符指针数组,在您的例子中,它充满了字符串文本

从这个意义上讲,
char*notes[]
意味着
notes[]
是指向char的数组指针

这意味着
节点
字符*
的数组,即字符指针数组

notes[]
的元素都应该是字符类型变量的地址

C隐式地将字符串文字(即,用双引号括起来的字符序列)转换为以null结尾的C字符串,并生成初始字符的地址作为指针添加到数组中。这就是数组初始化的方式

以下是如何将数据放入内存的示例:

Address Value Character
------- ----- ---------
1000000    65 A
1000001    98 b
1000002    00 NULL terminator
1000003    70 F
1000004    35 #
1000005    00 NULL terminator
1000006    66 B
1000007    00 NULL terminator
1000008    71 G
1000009    98 b
1000010    00 NULL terminator
1000011    68 D
1000012    00 NULL terminator
然后指针数组将按如下方式初始化:

notes = {1000000, 1000003, 1000006, 1000008, 1000011};
注意:上面的布局只是一个示例。字符串文本不一定要背靠背地放在内存中

char *notes[]
这是一个字符指针数组

char **notes 
将是指向char指针的指针,有点像二维字符数组,工作方式类似于
char*notes[]
但是,这不会分配堆栈空间,而数组会

其工作方式是字符串如“Ab”或“F#”实际上是一个字符序列,这就是char*note=“Ab”完全有效的原因,因为指针
note
,指向组成字符串的序列的第一个字符


所以
char*notes[]
是一个或多个排序数组,它类似于
char**notes
,因为这是一个指针,指向一系列指针的开头,每个指针指向一系列字符的开头。

首先,您必须了解
*
根据上下文具有不同的符号:

  • 在类型声明中,它表示指针类型
    e、 g.:
    int*p
    -
    p
    是指向
    int

  • 否则它就是取消引用操作符:
    e、 g.:
    *p=6
    -在
    p
    持有的地址处找到的值变为
    6

关于您的结构:

char *notes[] = {"Ab", "F#", "B", "Gb", "D"}
notes
是由5个元素组成的数组(从初始值设定项推导而来),类型为
char*
(指向char的指针)


“asdf”
是一个字符串文本。字符串文本的类型为
char[]
(C)/
const char[]
(C++)。([constant]char数组),它可以衰减为指针:在某些上下文中,可以转换为
char*
(不幸的是允许删除
const
,但这是另一种蠕虫)

这里的主要区别是
char*notes[]={…}
将为数组分配堆栈空间,而
char**
将不分配堆栈空间,这是任何其他指针的大小。(向读者澄清,虽然这两种类型相似,但在这个上下文中并不相同。)