2017-03-04 86 views
4

我相对比较新的编码方式,并且有一些问题理解指针如何与数组结合(他们自己我理解)。在C++中使用一个指向char数组的指针

我的理解,它可能创造像指针数组:

#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”指向一个指向char的指针。

我不应该答:

只能一个字符的地址分配给每个那4个三分球,我创建的。

和b:

仅能够分配的指针,到一个单字母(a炭),向每一个。

我希望有人能够在一定程度上帮助清除我的困惑。

+1

'“name A”''的类型实际上是'const char *'。 –

+1

1.请阅读'const' 2.'使用std is bad' - 谷歌也是如此 –

+0

请看这里的一些有用的编译器警告:http://coliru.stacked-crooked.com/a/f67971a42cebd76f –

回答

1

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

的COUT命令是建立这样,当你把它传递一个char *变量,它打印从存储器地址开始,直到达到一个零字节(二进制值0,而不是写字符“0”)的所有字符。

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

3

在C(和C++)中,字符串文字(例如"name A"等表达式)的类型为const char*。在引擎盖下,这些字符串字符存储在二进制文件的数据部分的某处。并且字符串文字用指向这些字符中第一个的指针代替。所以,下面的语句

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

指示编译器在数据段分配四个字符串,然后到四个指针分配给指针数组names

+5

在C++中,可以将字符串常量赋给const char *,但在C中也可以将它赋给char *。但是,这不是*字符串文字的类型 - 字符串文字不是字符指针,它们是字符数组。 – dasblinkenlight

+0

其次......'std :: cout << typeid(“foo”).name()'打印“char const [4]”。所以正确的解释是它是一个字符数组,编译器会用指向第一个字符的指针替换数组。 – zett42

+0

字符串文字类型是'const char [7]',而不是'const char *'只能在某些情况下从数组转换为指针prvalue –

2

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

“字符串litteral”是一个字符数组。而这个数组的地址是一个指向char的指针。所以没问题把它放在你的指针数组中。

现在你的代码编译了吗?还是它抱怨混合char *和const char *?这将是另一个问题,已经有很多答案了。SO

+0

在C++ 11之前,允许(但不赞成)字符串文字到'char *' –

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[]数组中。

相关问题