2016-08-05 117 views
1

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

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

这可能会显示正确的输出(10),但这可能会导致更大的程序问题,因为p最初有它可以是任何东西&以后可以在程序中作为well.So其他地方使用的垃圾地址,我相信这是incorrrect,正确的方法是:

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"; 

请指教

+1

char *等价于int * p; * p = 10;'会是'char * s; * s ='h';',不是你写的内容 –

+0

仅供参考您可以手动将地址分配给指针(请参阅[这里](http://stackoverflow.com/a/4532074/1559401))。在你的情况下,如果你有一个地址'10',你可以做'int * p =(int *)10'。你可以进一步显示这里[这里](http://stackoverflow.com/a/32631614/1559401)。在嵌入式系统上工作时,尤其是在为微控制器编写代码时,这特别有用。 – rbaleksandar

回答

5

您对字符串的理解不正确。

让我们例如第一行:

const char *str="hello"; 

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

然后让继续

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

这其实是不对的。 A 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的值是不确定

+0

感谢您的回答!我知道char * str =“hello”会导致str指向'h'。但我的问题就像你说的整数和其他数据类型指针,我们需要先分配一些地址,然后再分配目标值给它。像int * p; * p = 10 - 这是错误的,但char * str =“hello”是正确的。但在这种情况下,为什么它不会导致问题,因为我们也直接分配目标值而没有任何地址? – Ashu

+0

@Ashu在C++中,像“”hello“这样的字符串文字是一个常量”char“的数组。该数组由编译器创建并存储在某个地方(不相关的地方),其生命周期与程序运行一样长。与所有使用它的数组一样,它会衰减到指向其第一个元素的指针。基本上这就是当你做'const char * str =“hello;”'时发生的事情 –

1

当我宣布一个指针

int *p; 

我得到一个对象p其值地址。没有int s在任何地方创建。你需要做的是将p认为是是地址而不是int

此时,这并不是特别有用,因为除nullptr之外,您没有可以分配的地址。那么,从技术上说,这不是真的:p本身有一个地址,你可以用&p得到的地址,并将其存储在int**,甚至做一些可怕的事情,如p = reinterpret_cast<int*>(&p);,但让我们忽略它。

要用ints做点什么,你需要创建一个。例如如果你去申报

int x; 

你现在有一个int对象,它的值是整数,我们可以再与p = &x;其地址分配给p,然后通过*pp恢复对象。


现在,C风格的字符串有奇怪的语义—怪异的方面是是c 实际上并没有在所有字符串:它总是与char阵列工作。

字符串文字,像"Hello!",都保证(动作像他们)作为位于一些地址const char阵列存在,并且用C的奇转换规则,该阵列将自动转换为一个指针到它的第一元件。因此,

const char *str = "hello"; 

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

const char str2[6] ="world"; 

工作原理不同;这个(像它一样行动)创建一个全新的数组,并将字符串文字"world"的内容复制到新数组中。

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

char *str = "hello"; 

这不应该工作,因为"hello"const char一个数组,但该标准允许此具体使用。但是,您仍然不允许修改数组的内容。


1:由“仿佛”的规则,程序只需要表现仿佛的事情发生,因为我形容,但如果你偷看的汇编代码,实际的方式事情发生可以很不同。