zoukankan      html  css  js  c++  java
  • C++学习笔记(9)----关于变量和数组大小的一道容易出错的面试题

    一道容易出错的C++笔试题

    求下面代码的输出内容:

    int main(int argc,char* argv[])
    {
    	char str1[]="Hello";
    	char* str2="World";
    	cout<<sizeof(str1)<<endl
    		<<sizeof(str2)<<endl;
    	return 0;
    )
    

    解析:

    str1指向的是字符串 "Hello" 的首地址,但 str1 同时也是一个字符数组的首地址,而这个字符数组包含了字符串 "Hello" 末尾的 '',所以 sizeof(str1) 的值为 strlen(str1)+1 , 为6。
    有人就会自然而然地认为 sizeof(str2)= strlen(str2)+1,认为结果为6。 输出应为:

    6
    6
    

    其实不然。
    str1 代表了一个字符数组的首地址,但是,str1 并非一个变量,甚至可以认为它是一个宏,代表了 ['H','e','l','l','o',''] 这个字符数组的地址。或者说 str1 就是一个立即数,而不是一个左值。
    而 str2 则是一个 (char*) 型的变量,是一个左值。 目前在32位和64位系统中,在Visual Studio 中测试,只有 double 和 long long 型的变量是 8 个字节的,其它的基本类型变量的大小都是在 4 个及以下字节的,包括各类指针。所以,sizeof(str2) 的值为 4。
    上面代码的正确输出为:

    6
    4
  • 相关阅读:
    C# 给图片添加透明的文字、图片水印
    Parallel.Invoke 并行的使用
    C# 使用NPOI 导出Excel
    选择性的使用 serialize() 进行序列化
    C#中 计时器用法
    关于图片加载失败后显示默认图片
    C# 文件下载
    C#中 什么是装箱和拆箱
    MySql中 where IN 字符串
    管理信息系统 课程设计
  • 原文地址:https://www.cnblogs.com/dongling/p/5893671.html
Copyright © 2011-2022 走看看