您的位置:首页 > 编程语言 > C语言/C++

一道C++的笔试题

2014-04-16 16:51 211 查看
今天看到一道C++的笔试题,感觉不错!记录一下。
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; //true or false
cout << (str3 == str4) << endl;
cout << (str5 == str6) << endl;


代码如上,给出打印结果。

如果不了解数组与指针的区别的话,基本上答不出来这道题。下面我们来分析一下。

“char str1[] = "abc";”的含义是定义一个char型数组str1,初始化为abc。"abc"是一个常量,应该保存在常量存储区。那么是不是str1就等于"abc"的地址呢?当然不是!str1是一个变量,保存在栈中,这句话的意思是在栈中申请大小为4的空间,保存"abc"(包括\0)。同理,“char str2[]
= "abc";”
也是在栈中申请了额外的空间保存"abc",也就是说,现在有3个"abc"字符串,分别保存在栈中和常量存储区。那么我们应该清楚了,str1不等于str2。
对于“const char str3[] = "abc";”,大家千万别被const欺骗了。我们知道,使用const定义的变量一般是不分配内存的,而是保存在符号表中。但是对于const数组来讲,系统不确定符号表是否有足够的空间来存放const数组,所以还是为const数组分配内存的。所以str3指向的是栈上的"abc"。同理“const
char str4[] = "abc";”
也是一样。所以str3和str4不相同。
对于 “const char* str5 = "abc";”,str5是一个指针,保存在符号表上,指向的是常量存储区中的"abc"。“const char* str5 = "abc";”中str6也是指向常量存储区中的"abc",所以str5等于str6。

我还产生一个怀疑,就是我们看到的"abc"是否都是同一个"abc"。不妨试一试下面的代码:
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; //true or false
cout << (str3 == str4) << endl;
cout << (str5 == str6) << endl;  
cout<<&("abc")<<endl;


打印结果是





我们再看看数组和指针的地址:





嗯,正好验证了我们的想法。str1、str2、str3、str4都是指向栈空间的,而且这些变量是连续分配的,从这我们也可以看出栈空间分配的策略。str5和str6指向相同的地址,都是常量"abc"的地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: