char * notes [] = {“Ab”,“F#”,“B”,“Gb”,“D”}的混淆;和char **

时间:2015-07-16 18:56:56

标签: c++ pointers

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

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**演员是什么?它的意义是什么?

4 个答案:

答案 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>