char指针初始化相比非指针?怎么了

时间:2015-09-05 21:19:31

标签: c++ c pointers char

我知道你不能用普通的char来做这件事。

    char line1 = "hello";

但您可以使用指向char类型的指针

来执行此操作
    char* line2 = "hello";

我想知道为什么会这样,第二行代码会发生什么? 为什么第二次初始化可能? line2是否指向你好的第一个索引?它是否会创建某种数组并用hello填充它?我在一个编程类的c字符串类中使用它,我仍然对第二行代码中发生的事情感到困惑。

4 个答案:

答案 0 :(得分:3)

编译器确保您指定的以null结尾的字符串“hello”存在于内存中,并将指针初始化为指向该字符串的开头。

答案 1 :(得分:1)

写作时

char *line1 = "something";

line1被创建为堆栈上的指针(如果在自动作用域中)并被初始化为指向文字字符串"something"(带有空终止符)。确切地说,"something"字符串的类型char[10]包含空终止符,数组decays to a pointer包含此特定实例中的第一个元素。

存储该字符串的数据是已编译的可执行文件的数据部分,它是只读(即写入它可能会触发访问冲突)。

答案 2 :(得分:1)

在C和C ++中,当你创建一个字符串文字时,会隐式创建一个类型为char[]的变量,其中包含静态存储持续时间来保存它。该字符串将以空格终止,与C样式一致。

该行

char* line2 = "hello";

大致相当于

static char __string_literal_line2[] = "hello";
// At top of program or something

...
char * line2 = __string_literal_line2;

因此char[]以这种方式隐式衰减为char*

这样做的一个问题是,在某种意义上,数组确实是“const”,并且尝试修改它是未定义的行为,但C标准明确允许您将其分配给char *,所以那些不是const-correct的遗留代码仍然会编译,兼容C ++也允许这样做。

如果您正在进行编译时编程以利用字符串文字的“真实形式”,那么有时候非常方便。例如,在此代码示例中:

Passing constexpr objects around

class str_const {
    const char * const p_;
    const std::size_t sz_;
public:
    template <std::size_t N>
    constexpr str_const( const char( & a )[ N ] )
    : p_( a ), sz_( N - 1 ) {}

    ...
};

str_const对象现在可以在编译时从字符串文字构造为constexpr,它将知道字符串文字的大小,即使通常需要迭代或使用C库函数来确定那。那是因为它接收字符串文字为char[]而不是char *,它可以作为模板推导的一部分绑定到数组的长度。所以这些表达式是合法的,str_const对象在编译时知道字符串的长度:

str_const("foo");
str_const("foobar");
str_const("foobarbaz");

答案 3 :(得分:0)

char test[] = "Hello" // adds H e l l o \0 in the stack 

当你像f(&#34; Hello&#34;)那样做时,它会保留内存来存储H e l l O \ 0 当你这样做

char *test = "Hello";

它将Hello存储在某个地方并将测试初始化​​为内存情况,其中&#39; H&#39;存储。

基本上指针是4个字节的整数。您应该尝试一个程序,询问密码并验证如下:

if(password == "mypassword")

你的工作就是找到&#34; mypassword&#34;在生成的二进制文件中。