zoukankan      html  css  js  c++  java
  • 发现C++的sizeof关键字的奇怪问题

    在调试程序的时候发一个关于关键字sizeof的令我感到困惑的问题

    看下面的例子:

    int a[5]

    所有人都明白这里定义了一个数组,其包含了5 个int 型的数据。我们可以用a[0],a[1]等来访问数组里面的每一个元素。

    当我们定义一个数组a 时,编译器根据指定的元素个数和元素的类型分配确定大小(元素类型大小*元素个数)的一块内存,并把这块内存的名字命名为a。名字a 一旦
    与这块内存匹配就不能被改变。a[0],a[1]等为a 的元素,但并非元素的名字。数组的每一个元素都是没有名字的。那现在再来看看sizeof 关键字时的几个问题:
    sizeof(a)的值为sizeof(int)*5,32 位系统下为20。
    sizeof(a[0])的值为sizeof(int),32 位系统下为4。
    sizeof(a[5])的值在32 位系统下为4,此处并不会出错。关键字sizeof 求值是在编译的时候。虽然并不存在a[5]这个元素,但是这里也并没有去真正访问a[5],而是仅仅根据数组元素的类型来确定其值。所以这里使用a[5]并不会出错。

    sizeof(a)取5个元素的大小,在32位系统下为20,这个好理解,所有元素的sizeof值

    sizeof(&a[0])的值在32位系统下是4,这个也好理解,首元素a[0]的首地址.

    但是sizeof(&a) 在32位系统下VC++6.0的结果为20,这个令我非常难以理解,&a不是数组a的首地址么?&a既然是取a 的首址那不是应该为4才对吗?如果我的观点是正确的,那么是不是编译器出错了?如果我的观点的是错误的,那么&a就不是取首地址了?非常矛盾!

    希望高人指点。

  • 相关阅读:
    笔记35 跨重定向请求传递数
    判断邮箱的正则表达式
    按钮
    async await 的用法
    笔记34 Spring MVC的高级技术——处理multipart形式的数据
    Convert Sorted Array to Binary Search Tree
    Binary Tree Zigzag Level Order Traversal
    Unique Binary Search Trees,Unique Binary Search Trees II
    Validate Binary Search Tree
    Populating Next Right Pointers in Each Node,Populating Next Right Pointers in Each Node II
  • 原文地址:https://www.cnblogs.com/cgli/p/1891290.html
Copyright © 2011-2022 走看看