这一段程序

下面这段程序很有看点:
//arr1 is an array of ints
int *source=arr1;
size_t sz=sizeof(arr1)/sizeof(*arr1);//number of elements
int *dest=new int[sz];
while(source!=arr1+sz)
    *dest++=*source++;//copy element and increment pointers

1.source是一个指向数组arr1的第一个元素的指针.(开始时,*source与*arr1的值是一样的.)

2.sizeof操作符的作用是返回一个对象或类型名的长度,返回值类型为size_t,长度的单位是字节.

3.对数组做sizeof操作等效于将对其元素类型做sizeof操作的结果乘上数组元素的个数.因为sizeof返回整个数组在内存中的存储长度.

4.sizeof(*arr1),对指针arr1做sizeof操作,返回arr1所指的数组的第一个int型元素的类型长度.在这里,下面三种写法是等效的:

sizeof(*arr1)=sizeof(*source)=sizeof(int)

5.source!=arr+sz,这里是在比较地址(没有解引用),这里的数组名arr就自动转化成了指向数组第一个元素的指针,加几就指向其后面的第几个元素.

6.比较sizeof(arr1)和sizeof(*arr1).arr1不解引用做sizeof操作,编译器能判断出来这就是一个普通的指针还是一个数组名指针,如果这是个数组名,就返回整个数组在内存中的存储长度,否则就返回存放指针所需的内存大小,比如指针p里存放的地址是0x22ff50,那么存放这个地址需要4字节,则sizeof(p)返回4.而对于*arr1,这里arr1只是一个普通的指针.

-------------------------------

猜想

继续研究上面的第六点,写了这样一段测试程序:

char a[7]={'1','2','3','4','5','6','7'};
    char *b=&a[0];
    char *c=a;
    cout<<sizeof(a)<<endl;
    cout<<sizeof(a+2)<<endl;
    cout<<sizeof(b)<<endl;
    cout<<sizeof(c)<<endl;

输出的结果为:

7

4

4

4

那么,我想,或许真有数组名指针这种东西,也就是说指针a上可能有某种记号表明它是一个数组名,这种标志是数组创建的时候产生的,另一种可能就是指针a和7个数组元素存放的地址存在某种特殊联系.

C++ 对数组sizeof 和对数组元素sizeof的更多相关文章

  1. delphi 判断一个数组的长度用 Length 还是 SizeOf ?

    判断一个数组的长度用 Length 还是 SizeOf ?最近发现一些代码, 甚至有一些专家代码, 在遍历数组时所用的数组长度竟然是 SizeOf(arr); 这不合适! 如果是一维数组.且元素大小是 ...

  2. iOS 判断数组array中是否包含元素a,取出a在array中的下标+数组方法详解

    目前找到来4个解决办法,第三个尤为简单方便 NSArray * arr = @["]; //是否包含 "]) { NSInteger index = [arr indexOfObj ...

  3. 从数组中取出N个元素的所有组合——递归实现

    https://www.cnblogs.com/null00/archive/2012/04/27/2473788.html 今天在做POJ 1753时,需要枚举一个数组中所有组合.之前也遇到过类似的 ...

  4. C 语言:返回两个数组中第一个相同元素的指针(我用了loop 、goto loop标签)

    // //  main.c //  Pointer_search // //  Created by ma c on 15/8/2. //  要求:通过指针查找,实现比较两个有序数组中的元素,输出两个 ...

  5. 判断一个数组的长度用 Length 还是 SizeOf ?

    最近发现一些代码, 甚至有一些专家代码, 在遍历数组时所用的数组长度竟然是 SizeOf(arr); 这不合适! 如果是一维数组.且元素大小是一个字节, 这样用看不出错误, 譬如: var   arr ...

  6. 从数组A中删除在数组B中存在的元素,用C语言实现

    从数组A中删除在数组B中存在的元素,用C语言实现 考验数组操作的能力,C语言的熟练程度. //功能:从数组A中删除在数组B中也存在的数据 //输入:arrA --- 数组A // lenA --- 数 ...

  7. javascript判断数组中是否包含某个元素

    //判断数组array中是否包含元素obj的函数,包含则返回true,不包含则返回false function array_contain(array, obj){ for (var i = 0; i ...

  8. JavaScript从数组中删除指定值元素的方法

    本文实例讲述了JavaScript从数组中删除指定值元素的方法.分享给大家供大家参考.具体分析如下: 下面的代码使用了两种方式删除数组的元素,第一种定义一个单独的函数,第二种为Array对象定义了一个 ...

  9. [java]删除数组中的某一个元素

    package org.company.project.test; import java.util.Arrays; import java.util.Scanner; public class Ar ...

随机推荐

  1. Shell:sed流编辑器

    转载:http://blog.sina.com.cn/s/blog_ac9fdc0b0101lvdv.html sed和awk是永远地痛,学了又忘,主要是木有横向对比过,所以总把握不到精髓.它可以完美 ...

  2. nodejs的mysql模块学习(四)断开数据库连接

    断开连接有两种方式 end()函数 在这种情况下 所有先前排队的查询 仍然可以继续继续发送到服务器,但是如果在执行到断开连接的命令之前发生了致命的错误,那么end()将不会被执行 connection ...

  3. LINQ to Entities 不识别方法“System.String ToString()”,因此该方法无法转换为存储表达式。

    var data = DataSource.Skip(iDisplayStart).Take(iDisplayLength).Select(o => new { MatNR = o.MatNR, ...

  4. python(1) - 变量小测试

    下面看一道题目: a = 3 b = a a = 5 print(a,b) 程序最后输出的a,b值分别是多少呢? 先想一想,然后我们执行一下看看正确答案: 正确答案 a 的值是5, b的值是3,为什么 ...

  5. LeetCode 268

    Missing Number Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one ...

  6. [改善Java代码]适时选择不同的线程池来实现

    Java的线程池实现从最根本上来说只有两个:ThreadPoolExecutor类和ScheduledThreadPoolExecutor类,这两个类还是父子关系,但是Java为了简化并行计算,还提供 ...

  7. ClassLoader类加载器

    总的来说,当动态加载一个资源时,至少有三种类加载器可供选择: 系统类加载器(也被称为应用类加载器)(system classloader) 当前类加载器(current classloader) 当前 ...

  8. Groovy选型

    Groovy是一门基于JVM的动态语言,同时也是一门面向对象的语言,语法上和Java非常相似.它结合了Python.Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代 ...

  9. js学习笔记—转载(闭包问题)

    ---恢复内容开始--- 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.     一.变量的作用域 要理解闭包,首先必须理解Javascrip ...

  10. Servlet & JSP - Servlet API Overview

    Servlet & Generic & HttpServlet 类图 Servlet 的生命周期 init.service 和 destroy 是 servlet 的生命周期方法,它们 ...