异常beteen一个char poiner和一个整数指针
问题描述:
int *a;
*a=3;
cout<<a;
为什么上面的代码片断显示内存地址,而下面的代码片段显示整个字符串本身?异常beteen一个char poiner和一个整数指针
char *a;
a="string";
cout<<a;
我如何分配“串”直接一个而在INT指针的情况下是不可能的? 分配“串”为指针一个应更换地址本身,对不对? 如果情况并非如此,请详细说明编译此代码时发生的情况。
答
在第一个例子,int *a;
创建一个指向int
有一个未定义的值,即你没有指定它指向任何地方。
然后,第二行放置在随机位置值3的a
这很可能导致程序崩溃,但并不总是指向。
第三行打印指针作为存储器地址的值。
在第二个示例中,char *a;
创建了一个指向char
的未定义值的指针,即您未将它指定给任何指向的位置。
第二行然后分配a
指向常量字符串string
。
第三行输出a的字符串值,因为std :: stream类专用<<
运算符,用于输出字符串char*
。
答
std:ostream
专门基于所述数据类型的<<
运算符。对于char*
,它假设一个字符串,因为这是C++进化的C语言中使用的惯例。对于其他指针类型,运算符<<
只显示指针,因为没有建立终止非char数组的约定(char数组字符串由字符值零终止)。
在a = "string"
的情况下,"string"
的地址将被存储(尽管一个好的编译器会警告你关于const
的问题)。这是一种仅适用于字符数组的特殊情况语法 - 同样,因为这是C语言管理文本的方式。另外,这种为char
类型提供特殊情况处理的趋势在多年以来一直困扰着我多次,当我尝试显示一个8位整数时,却显示出一个字符 - 强制我投射。
uint8_t i=65;
cout<<"results: "<<i<<", "<<(int)i<<"\n";
results: A, 65
'* a = 3'表现出未定义的行为,通过取消引用未初始化的指针。 –
第二个示例调用'operator