首页 > 试题广场 >

以下三条输出语句分别输出什么? int mai

[单选题]
以下三条输出语句分别输出什么? 

int main (void) {

    char str1[] = “abc”;

    char str2[] = “abc”;

    const char str3[] = “abc”;

    const char str4[] = “abc”;

    const char* str5 = “abc”;

    const char* str6 = “abc”;

 

    cout << (str1 == str2) << endl;

    cout << (str3 == str4) << endl;

    cout << (str5 == str6) << endl;

    return 0;

    }


  • false,true,true;
  • false,true,false;
  • true,false,false;
  • false,false,true;
数组名是数组的地址。同样,字符串常量是字符串所在的地址。
定义一个数组可以理解为两个过程:1.建立数组空间,分配地址2.往空间里面赋值。故即使数组里元素值是一样的,存在两个位置,数组的地址也是不同的。
字符串常量也可以理解为两个过程:1.如果没有字符串常量值的话建立常量值。2.有字符串常量值的话,指针直接指向字符串常量,即多个指针(str5和str6)指向同一个字符串常量"abc"
三对比较都是比较的字符串地址,但为什么只有 str5和str6是相同的呢?
是因为
const char* str5 = “abc”;
const char* str6 = “abc”;
这种定义方式是定义了两个字符串常量"abc"的指针,只有一个位置存放了值"abc",二者指向的是同一个位置,故相等。
编辑于 2019-02-26 21:28:38 回复(2)
C++ Primer Plus P142;
若 测试  字符数组中(word是数组名) 的字符串是不是"mate" ,

word == "mate" 
则是不对的。
数组名是数组的地址。同样,字符串常量也是其地址。 因此 此关系表达式 不是判断两个字符串是否相同,而是查看他们是否存储在相同的地址上。

我自己的理解是:
在编译阶段,程序会对全局变量分配内存,
对于数组,内存分配好,但内容为0XCC,初始化之后才会显示正确的内容。
对于数组指针,由于未初始化,因此指向0xcccccccc。

在运行阶段,
数组会被初始化,但是内存 由于已经提前分配了,所以 各变量的地址肯定不同;
而指针被初始化之后,会指向赋值量的地址(本题中"abc"为字符串常量地址不会改变,其被保存在特定位置(数据段中的常量区部分))
因此str5,str6都会指向"abc"常量的地址,因此相同;
即使是char * str5, *str6 ; str5 = "abc", str5 = "abc"; str5,str6也会相同;
但若 str5 = "bcd" 后,会指向"bcd"常量的地址, 此时 str5 != str6。

一点拙见,哪里有错误希望得到指正 ^ ^
发表于 2018-08-14 09:29:54 回复(0)
第一个和第二个比较的都是地址值,只有第三个是真值
发表于 2018-08-01 19:02:37 回复(4)

数组在栈中分配,即使两个数组的值一样,在栈中也会存储成两份;

常量存储在常量区,str5和str6为char*型(指向char型变量的指针),因为常量在常量区只有一份拷贝,因此str5和str6指向的地址都是一样的

发表于 2019-03-03 17:07:21 回复(0)
str1和str2是字符数组,虽然存储的内容一样,但是str1和str2分别代表了两个不同的地址
str3str4是常量字符数组,它与上面的不同是它里面的内容不能改变,但是str3str4也代表了两个不同的地址
"abc"是字符串常量,str5和str6分别是常量字符串指针,指向字符串常量"abc",所以str5和str6相等。

有什么问题希望大家批判指出
发表于 2023-02-28 10:21:14 回复(0)
因为str1 和 str2 都是字符数组,每个都有其自己的存储区,它们的值则是各存储区的首地址。因为str3和str4两个字符数组都存储在栈空间上,但两者地址值不相等。而str5 和str6并非字符数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于常量区,str5 和 str6 是指它们指向的地址的首地址,而它们自己仅是指向该区首地址的指针,所以相等(&str5 和 &str6 是指指针自己的地址,所以两者地址是不相等的)。

发表于 2019-05-28 16:52:18 回复(0)
第一个和第二个是保存的数组第一个元素的地址,第二个是指针,指向字符串
发表于 2018-08-05 11:41:26 回复(0)