C++ 对数组sizeof 和对数组元素sizeof
这一段程序
下面这段程序很有看点:
//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的更多相关文章
- delphi 判断一个数组的长度用 Length 还是 SizeOf ?
判断一个数组的长度用 Length 还是 SizeOf ?最近发现一些代码, 甚至有一些专家代码, 在遍历数组时所用的数组长度竟然是 SizeOf(arr); 这不合适! 如果是一维数组.且元素大小是 ...
- iOS 判断数组array中是否包含元素a,取出a在array中的下标+数组方法详解
目前找到来4个解决办法,第三个尤为简单方便 NSArray * arr = @["]; //是否包含 "]) { NSInteger index = [arr indexOfObj ...
- 从数组中取出N个元素的所有组合——递归实现
https://www.cnblogs.com/null00/archive/2012/04/27/2473788.html 今天在做POJ 1753时,需要枚举一个数组中所有组合.之前也遇到过类似的 ...
- C 语言:返回两个数组中第一个相同元素的指针(我用了loop 、goto loop标签)
// // main.c // Pointer_search // // Created by ma c on 15/8/2. // 要求:通过指针查找,实现比较两个有序数组中的元素,输出两个 ...
- 判断一个数组的长度用 Length 还是 SizeOf ?
最近发现一些代码, 甚至有一些专家代码, 在遍历数组时所用的数组长度竟然是 SizeOf(arr); 这不合适! 如果是一维数组.且元素大小是一个字节, 这样用看不出错误, 譬如: var arr ...
- 从数组A中删除在数组B中存在的元素,用C语言实现
从数组A中删除在数组B中存在的元素,用C语言实现 考验数组操作的能力,C语言的熟练程度. //功能:从数组A中删除在数组B中也存在的数据 //输入:arrA --- 数组A // lenA --- 数 ...
- javascript判断数组中是否包含某个元素
//判断数组array中是否包含元素obj的函数,包含则返回true,不包含则返回false function array_contain(array, obj){ for (var i = 0; i ...
- JavaScript从数组中删除指定值元素的方法
本文实例讲述了JavaScript从数组中删除指定值元素的方法.分享给大家供大家参考.具体分析如下: 下面的代码使用了两种方式删除数组的元素,第一种定义一个单独的函数,第二种为Array对象定义了一个 ...
- [java]删除数组中的某一个元素
package org.company.project.test; import java.util.Arrays; import java.util.Scanner; public class Ar ...
随机推荐
- Shell:sed流编辑器
转载:http://blog.sina.com.cn/s/blog_ac9fdc0b0101lvdv.html sed和awk是永远地痛,学了又忘,主要是木有横向对比过,所以总把握不到精髓.它可以完美 ...
- nodejs的mysql模块学习(四)断开数据库连接
断开连接有两种方式 end()函数 在这种情况下 所有先前排队的查询 仍然可以继续继续发送到服务器,但是如果在执行到断开连接的命令之前发生了致命的错误,那么end()将不会被执行 connection ...
- LINQ to Entities 不识别方法“System.String ToString()”,因此该方法无法转换为存储表达式。
var data = DataSource.Skip(iDisplayStart).Take(iDisplayLength).Select(o => new { MatNR = o.MatNR, ...
- python(1) - 变量小测试
下面看一道题目: a = 3 b = a a = 5 print(a,b) 程序最后输出的a,b值分别是多少呢? 先想一想,然后我们执行一下看看正确答案: 正确答案 a 的值是5, b的值是3,为什么 ...
- LeetCode 268
Missing Number Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one ...
- [改善Java代码]适时选择不同的线程池来实现
Java的线程池实现从最根本上来说只有两个:ThreadPoolExecutor类和ScheduledThreadPoolExecutor类,这两个类还是父子关系,但是Java为了简化并行计算,还提供 ...
- ClassLoader类加载器
总的来说,当动态加载一个资源时,至少有三种类加载器可供选择: 系统类加载器(也被称为应用类加载器)(system classloader) 当前类加载器(current classloader) 当前 ...
- Groovy选型
Groovy是一门基于JVM的动态语言,同时也是一门面向对象的语言,语法上和Java非常相似.它结合了Python.Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代 ...
- js学习笔记—转载(闭包问题)
---恢复内容开始--- 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascrip ...
- Servlet & JSP - Servlet API Overview
Servlet & Generic & HttpServlet 类图 Servlet 的生命周期 init.service 和 destroy 是 servlet 的生命周期方法,它们 ...