为什么const char * foo =" Hello&#34 ;;编译但不是const int * foo = 5;?

时间:2016-10-30 20:26:21

标签: c++ c arrays pointers

如果我错了,请纠正我,但我已经假设了这行代码:

const char *foo = "Hello";

意味着一系列字符充满了" Hello"在堆栈的某处创建,foo是指向它的指针。在这种情况下,我不明白为什么这行代码会从' int'中无效转换。到' const int *'

const int *foo = 5;

不知道它只是在堆栈的某个地方创建一个5的整数并且foo指向它吗?

3 个答案:

答案 0 :(得分:5)

因为"Hello"char [N]类型const char[N](在C中)和char*(在C ++中),它会衰减为类型const char*(在C)或5(在C ++中),与您绑定它的指针相同。另一方面,int是一个右值,其类型为const int*,因此您无法将其绑定到<ul class="topnav"> <a href="javascript:void(0);" onclick="myFunction()"><li class="menu">Menu</li></a> <li>test 1</li> <li>test 2</li> <li>test 3</li> </ul> 类型的指针。

您可能会发现string literal有用。

答案 1 :(得分:0)

在第一个实例中,您使用字符串文字来初始化foo的值。

在第一个中,foo本身是一个指向char的常量指针,在某些方面&#34;特殊&#34;与其他指针相比。

对于大多数指针,例如在第二个示例中,将foo声明为指向int的常量指针,初始化 地址 您希望指向指向的指针。

换句话说,以下代码:

const int *foo = 5;

错误是因为当你真的想要foo指向值5时,你告诉编译器foo的地址是5。

您可以使用取消引用运算符来访问存储在foo中的值;你想说的是:

const int *foo = malloc(sizeof(int));
*foo = 5;

字符串文字是一种特殊情况:它们受到特殊处理,因为C表示字符串为由&#39; \ 0&#39;终止的字符数组。

const char *foo = "Hello";

将foo的地址设置为指向字母&#39; H&#39; in&#34; Hello \ 0&#34;。以这种方式使用的所有字符串文字都存储在一个特殊的内存部分,该部分往往是只读的;试图像这样修改foo:

foo[0] = 'W';

会导致未定义的行为。

初始化上下文中字符串文字的特殊行为与数组偶尔衰减为指针的方式有关;当一个数组被赋值给一个指针时,你真的在​​说明你希望指向的指针指向给定数组的第一个元素。

最后一点:

您可以强制编译器使用强制转换将5解释为内存地址:

// In C:
const int *foo = (const int*) 5;
// In C++:
const int *foo = reinterpret_cast<const int *>(5);

但是,您的程序可能会崩溃,因为您的程序可能无法访问存储在内存位置5的内容。

答案 2 :(得分:0)

//  const char* c = 5;
//  const char* c = '5';
//  const int*  i = 7;

只要没有接受的转换,上面的三行就会产生编译时错误。所以c期望一个文字字符串,你传递一个字符或整数值。

这就像在strcmp中传递一个char而不是字符串时发生的事情:

char* name = "name";
char  c = 'a'; 

if(strcmp(c, name));// error cannot convert first parameter from char to const char*