一道C++的笔试题
2014-04-16 16:51
211 查看
今天看到一道C++的笔试题,感觉不错!记录一下。
代码如上,给出打印结果。
如果不了解数组与指针的区别的话,基本上答不出来这道题。下面我们来分析一下。
“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"。不妨试一试下面的代码:
打印结果是
我们再看看数组和指针的地址:
嗯,正好验证了我们的想法。str1、str2、str3、str4都是指向栈空间的,而且这些变量是连续分配的,从这我们也可以看出栈空间分配的策略。str5和str6指向相同的地址,都是常量"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;
代码如上,给出打印结果。
如果不了解数组与指针的区别的话,基本上答不出来这道题。下面我们来分析一下。
“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"的地址。
相关文章推荐
- C语言可变参数va_start、va_arg、va_end的用法
- c语言的基本函数
- C++实现Hash表
- c语言 static的作用
- 关于c++中的静态函数
- C++句柄类
- C++11 理解 之 多态函数对象包装器
- C++技巧:加载图标LoadIcon,SetIcon
- 算法 - 求子数组的最大和(C++)
- c++中的一些数学库函数
- Trie的C++实现及HDU1251,hdu1671
- 明晰C++内存分配的五种方法的区别
- C++对C的“增强”,表现在六个方面:
- 学习C++,对字符的处理
- C语言是C++的基础,C++和C语言在很多方面是兼容的。
- visual studio 2012进行C语言开发[图文]
- C语言指针与数组
- 从零单排c++ primer(4)
- C语言与Java语言的比较
- 一个封装好的C++比特数组BitArray,可以对位进行直接操作