在C ++中使用指向char数组的指针

时间:2017-03-04 09:30:52

标签: c++ arrays pointers

我是Coding的新手,并且有一些问题需要理解指针如何与数组结合使用(我自己理解这些数据)。

我知道可以创建一个指针数组,如:

#include <iostream>
using namespace std;

int main() {
    int i;
    int *pArr[10];
    pArr[0]=&i;
    return 0;
}

在教程中,我找到了以下代码:

#include <iostream>
using namespace std;

int main() {
    char *names[4] = {
        "name A",
        "name B",
        "name C",
        "name D"
};

for (int i = 0; i < 4; i++) {
    cout << names[i] << endl;
}
return 0;
}

为什么我可以分配多个字符,或者说一个字符串,比如“name A”这样的字符串指向一个字符。

我不应该A:

只能为我创建的4个指针中的每一个指定char的地址。

和B:

只能为每个字母分配一个指针(一个字母)。

我希望有人能在某种程度上帮助澄清我的困惑。

4 个答案:

答案 0 :(得分:6)

这是编译器提供的一种快捷方式,使程序员可以更轻松地在代码中包含字符串。

当您编写字符串文字 "name A"时,编译器会为您准备一个七字符数组:

const char hidden0[] = {110, 97, 109, 101, 32, 65, 0}; // "name A"

前六个数字对应于字符串中符号的字符代码。最后一个字符为零 - 即所谓的空终止符。

编译器对所有四个字符串文字执行相同操作,因此您的数组初始值设定项如下所示:

const char *names[4] = {
    &hidden0[0],
    &hidden1[0],
    &hidden2[0],
    &hidden3[0]
};

hiddenK是为相应的字符串文字创建的数组。它没有名称,但编译器知道它的地址,并将其放在name[]数组中。

答案 1 :(得分:3)

在C(和C ++)中,字符串文字(诸如"name A"之类的表达式)具有类型const char*。在引擎盖下,这些字符串字符存储在二进制文件的数据部分中的某处。字符串文字用指向第一个字符的指针代替。那么,以下陈述

char *names[4] = {
    "name A",
    "name B",
    "name C",
    "name D"
};

指示编译器在数据部分中分配四个字符串,然后分配指针数组names的四个指针。

答案 2 :(得分:2)

你已经创建了一个4个指向char的指针数组。

A&#34; string lateral&#34;是一个char数组。并且此数组的地址是指向char的指针。所以把它放在你的指针数组中没问题。

现在您的代码是否已编译?或者它是否抱怨混合char *和const char *?这将是另一个问题,已经有很多关于SO的答案

答案 3 :(得分:1)

每个char *指向字符串中的第一个字符。当你看到嵌入了“mystring”的文字字符串时,char *指向“mystring”的“m”。

构建cout命令,当你传递一个char *变量时,它会打印从该内存地址开始的所有字符,直到它达到零字节(二进制值0,而不是写入字符“0”)。

这样做的最终结果是你可以实际增加char *指针以获得更短的字符串。例如如果你向指向“mystring”的指针添加1,它现在将指向“ystring”。所以你的假设基本上是正确的,char *指向一个字符,而不是整个单词。