我真的很困惑这种类型的指针定义:
char *notes[] = {"Ab", "F#", "B", "Gb", "D"};`.
我理解notes
这里是一个指向char的指针数组,我理解为注释'元素应该都是char类型变量的地址。我哪里错了?那么这是如何工作的?
#include<iostream>
#include<string>
using namespace std;
int main()
{
char *notes[] = {"Ab", "F#", "B", "Gb", "D"};
cout << *(char**)(notes+2);
}
那里的char**
演员是什么?它的意义是什么?
答案 0 :(得分:8)
从这个意义上讲,
的数组指针char *notes[]
表示notes[]
是一个指向char
这意味着nodes
是一个char*
数组,即一个字符指针数组。
notes[]
的元素都应该是char类型变量的地址。
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};
注意:以上布局只是一个例子。字符串文字可能不一定要背靠背地放在内存中。
答案 1 :(得分:4)
您的陈述:
的数组指针
nodes[]
表示char
是指向char *nodes[]
并非完全正确。 nodes
表示{{1}}是一个字符指针数组,在您的情况下,它充满了字符串文字。
答案 2 :(得分:3)
char *notes[]
这是一个char指针数组。
char **notes
将是指向char指针的指针,类似于二维字符数组,其工作方式类似于char *notes[]
,然而,这不会分配堆栈空间,而数组将
这种方式的工作方式是字符串,如“Ab”或“F#”实际上是一系列字符,这就是为什么char * note =“Ab”完全有效,因为指针,note
,指向构成字符串的序列的第一个字符。
所以char *notes[]
是一个或多个排序数组,这使得它类似于char **notes
,因为这是一个指向序列指针的开头的指针每个都指向一系列字符的开头。
答案 3 :(得分:1)
首先,你必须明白*
根据具体情况有不同的意义:
表示指针类型。
例如:int *p
- p
是指向int
的指针
其他是取消引用运算符:
例如:*p = 6
- p
地址所持的值变为6
关于你的结构:
char *notes[] = {"Ab", "F#", "B", "Gb", "D"}
notes
是一个由数组char *
(指向char的指针)的5(从初始化程序推导出来)元素组成的数组
"asdf"
是一个字符串文字。字符串文字的类型为char []
(C)/ const char []
(C ++)。 ([常量]字符数组),它可以衰减为指针:在某些上下文中,可以强制转换为char *
(不幸的是允许丢弃const
,但这是另一种蠕虫病毒)< / p>