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**
将不分配堆栈空间,这是任何其他指针的大小。(向读者澄清,虽然这两种类型相似,但在这个上下文中并不相同。)