【问题标题】:Initialization of pointers in c++c++中指针的初始化
【发布时间】:2016-12-11 08:49:37
【问题描述】:

我需要澄清关于 C++ 中指针初始化基础知识的概念。根据我的理解,在使用指针放置一些值之前,必须为指针分配一个地址。

int *p;
*p=10; //inappropriate
cout << *p <<"\n";

这可能会显示正确的输出 (10),但这可能会在较大的程序中引起问题,因为 p 最初有垃圾地址,可以是任何东西,以后也可能在程序的其他地方使用。所以,我相信这是不正确,正确的做法是:

int *p;
int x=10;
p=&x;  //appropriate
cout << *p <<"\n";

我的问题是,如果上面的理解是正确的,那么 char* 也一样吗?:

const char *str="hello";  // inappropriate
cout << str << "\n";
//OR
const string str1= "hello";
const char str2[6] ="world";
const char *str=str1;  //appropriate
const char *st=str2;  //appropriate
cout << str << st << "\n";

请指教

【问题讨论】:

  • int *p; *p = 10; 的 char 等价物是 char *s; *s = 'h';,而不是你写的
  • 仅供参考您可以手动将地址分配给指针(请参阅here)。在您的情况下,如果您有地址10,您可以使用int* p = (int *)10。您可以更进一步,如显示的here。这在处理嵌入式系统时尤其有用,尤其是在为微控制器编写代码时。

标签: c++ pointers


【解决方案1】:

你对字符串的理解是错误的。

让我们以第一行为例:

const char *str="hello";

这实际上是正确。像"hello" 这样的字符串文字被编译器转换为常量数组,并且像所有数组一样,它可以衰减为指向其第一个元素的指针。所以你正在做的是让str指向数组的第一个字符。

那我们继续

const string str1= "hello";
const char *str=str1;

这实际上是错误的。 std::string 对象没有定义转换为 const char * 的转换运算符。编译器会给你一个错误。您需要使用c_str 函数去获取指向所包含字符串的指针。

最后:

const char str2[6] ="world";
const char *st=str2;  //appropriate

这实际上与声明和初始化str 时的第一行没有什么不同。正如您所说,这是“适当的”。


关于第一个带有“不适当”指针的示例:

int *p;
*p=10; //inappropriate
cout << *p <<"\n";

这不仅“不合适”,还会导致undefined behavior 并且实际上可能崩溃您的程序。另外,正确的说法是p 的值是indeterminate。

【讨论】:

  • 感谢您的回答!!我知道 char *str="hello" 导致 str 指向“h”。但是我的问题就像您对整数和其他数据类型指针所说的那样,我们需要先分配一些地址,然后再为其分配目标值。例如 int *p; *p=10 -- 这是错误的,但 char *str="hello" 是正确的。但是在这种情况下,为什么它不会引起问题,因为这里我们也直接分配了没有任何地址的目标值?
  • @Ashu 在 C++ 中,像 "hello" 这样的字符串字面量是常量 char 的数组。该数组由编译器创建并存储在某处(与何处无关),其生命周期与程序运行时间一样长。像使用它时的所有数组一样,它衰减为指向其第一个元素的指针。基本上这就是你做const char* str = "hello;"时发生的事情
【解决方案2】:

当我声明一个指针时

int *p;

我得到一个对象p,其值为地址。不会在任何地方创建 ints。您需要做的是将p 视为是一个地址,而不是是一个int。

此时,这并不是特别有用,因为除了nullptr 之外,您没有可以分配给它的地址。好吧,从技术上讲,这不是真的:p 本身有一个地址,您可以使用&amp;p 获得并将其存储在int** 中,甚至可以做一些可怕的事情,例如p = reinterpret_cast&lt;int*&gt;(&amp;p);,但让我们忽略它。

要对ints 做某事,您需要创建一个。例如如果你继续声明

int x;

您现在有一个值为整数的int 对象,然后我们可以使用p = &amp;x; 将其地址分配给p,然后通过*p 从p 中恢复该对象。


现在,C 风格的字符串有奇怪的语义 - 最奇怪的方面是 C 实际上根本没有字符串:它总是使用 char 的数组 .

字符串字面量,如"Hello!",保证(act1 像它们一样)作为位于某个地址的const char 数组存在,并且根据 C 的奇数转换规则,该数组会自动转换为指向其第一个元素的指针。因此,

const char *str = "hello";

将h 字符的地址存储在该字符数组中。声明

const char str2[6] ="world";

工作方式不同; this (acts1 like it) 创建一个全新的数组,并将字符串文字 "world" 的内容复制到新数组中。

顺便说一句,这里有一个过时和弃用的功能与旧程序兼容,但由于某些误导的原因,人们现在仍在新程序中使用它,所以你应该注意它并且它是“错误的”:你'被允许打破类型系统并实际编写

char *str = "hello";

这应该不起作用,因为"hello" 是const char 的数组,但标准允许这种特定 用法。但是,您实际上仍然不能修改数组的内容。


1:根据“好像”规则,程序只需按照我的描述就好像事情发生,但是如果你偷看汇编代码,事情发生的实际方式可能是非常不同。

【讨论】:

    猜你喜欢
    • 2011-04-10
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多