char,指针,演员和字符串问题

时间:2010-08-20 06:43:57

标签: c++ pointers

/*1*/ const char *const letter = 'A';

/*2*/ const char *const letter = "Stack Overflow";

为什么1无效但2有效?

letter是一个需要分配地址的指针。被引用的字符串地址?我假设这就是为什么#2有效并且单引号字符串不被视为地址?

另外,这两种铸造类型有什么区别?:

static_cast<>()

最后,如果var是char变量,为什么cout&lt;&lt; &amp; var&lt;&lt;出来乱码?为什么我必须把它变成无效*?

感谢您对初学者问题的耐心。

6 个答案:

答案 0 :(得分:8)

因为'A'不是指针,如果基础字符集是ASCII,则它是char,65或41 16

另一方面,

"Stack"是字符串,基本上是字符数组{'S', 't', 'a', 'c', 'k', '\0'},它降级为指针到第一个字符。

您的“static_cast()之间的差异”已经回复here,远远超过我的能力。

您使用char var = 'x'; cout << &var ...获得垃圾的原因是因为&varchar *,这意味着它被视为字符串 - 在这种情况下,cout输出字符直到最后的空字符\0不存在,或者超出角色。以下代码显示了这一点:

#include <iostream>
int main() {
    //int q1 = 0;
    char xx = 'x';
    //int q2 = 0;
    std::cout << &xx << std::endl;
    return 0;
}

输出:

x~Í"

当您取消注释q行时,它会起作用,因为它会在角色周围放置零,并自行输出x。请记住,这不是犹太人C,它只是因为我的堆栈组织方式而起作用。不要使用这是真正的代码。

答案 1 :(得分:0)

第一个只是char类型,其值为A ..此外,没有单引号字符串,只有单引号char ..

虽然第二个是array of characters,因此它有效..

char letter [] = { 'H', 'e', 'l', 'l', 'o', '\0' };
char letter [] = "Hello"; 

两者都为letter指定了相同的初始化方法。

答案 2 :(得分:0)

对于您的第二个问题,此link将非常有用。

答案 3 :(得分:0)

在这种情况下,'A'只是一个值(可能是'65')。每当C在单引号中看到某些内容时,它就会假定它正在处理单个字符。因此,你实际上是在说指针'字母'将指向存储器地址65处的任何内容。 。可能不是你想要的,所以编译器将其标记为错误。

另一方面,当你指定一个字符串(“A”)时,编译器会在幕后做一些魔术来使它工作。它接受该字符串并将其放入可执行文件中,然后每次使用该特定字符串时,它都会替换它所知道的字符串的内存地址,以用于放入程序中的文字。

此外,static_cast(value)优先于(类型)值,因为static_cast&lt;&gt;()往往会更加限制(因此在编译时会捕获更多错误)。它也更冗长(例如,const_cast(value)会将const(不可变)的值转换为可由代码修改的值。

HTH

答案 4 :(得分:0)

您可以将char视为整数类型(int但更短),因此当您编写char l = 'A';时,只需对A的数字ASCII值进行签名在变量l

当你写char* letters = "foo"时,结果会与以下内容相似

char letters[4];
letters[0] = 'f';
...
letters[3] = '\0';

答案 5 :(得分:0)

我通常遵循的一种方法是使用typeid运算符来理解我正在处理的类型。

因为type_info :: name返回一个实现定义的字符串,所以通常会多次安静地解释我们正在处理的内容。使用gcc编译时会显示以下输出

#include <iostream>
#include <typeinfo>
using namespace std;

int main(){
   cout << typeid('A').name() << endl;                      // prints 'c' meaning char
   cout << typeid("Stack Overflow").name() << endl;         // prints 'A15_c' meaning
                                                            // array of 15 characters
}