一道C++的笔试题

今天看到一道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;

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

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

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

打印结果是

2011-09-27_232054

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

2011-09-27_232150

嗯,正好验证了我们的想法。str1、str2、str3、str4都是指向栈空间的,而且这些变量是连续分配的,从这我们也可以看出栈空间分配的策略。str5和str6指向相同的地址,都是常量"abc"的地址。

        好了,本文今天就写到这了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值