C++ 数组长度 以及 数组名作为参数传递给函数 以及 为什么不在子函数中求数组长度
在看排序,首先是插入排序,思路理清后想用代码实现,然后问题来了: 如何求数组长度? 如果没记错,在Java中应该是有直接可用的方法的, Python中(序列)也有.len,在C/C++中,字符串倒是有strlen() (需要#include <string.h>) 一个办法是用 sizeof() 一、
首先定义数组
int array[] = {,,,,};
一开始想都没想就直接在子函数里面
int array_length(int a[]){
int len = sizeof(a)/sizeof(a[]); return len;
}
然而在主函数中调用的结果并不是5 ,而是8 。 如果把子函数中的代码直接用到主函数中,则能得到正确的答案 5
#include <iostream> int main(int argc, const char * argv[]) {
int array[]={,,,,};
int len = sizeof(array)/sizeof(a[]); cout<<len<<endl;
}
改变数组元素数量和内容,还是这样。比如数组元素增加到6个,如果用子函数,则还是得到8,如果在主函数中直接用sizeof(),则得到6 奇怪了,同样的代码,在main()里面好好的,到了子函数里面咋就不行了?
二、
这篇文章指出:
参数的传递是将实参的值赋给形参。然而对于数组来说却是一个例外,因为数组的数据太多了,将其一一赋值既麻烦又浪费空间,所以数组作为参数传递给函数的只是数组首元素的 地址,函数在需要用到后面元素时再按照这个地址和数组下标去查找。也就是说后面的元素根本没到函数里来,所以在函数里求不出数组的大小也就不足为奇了。
/******因此写形式参数时既可以
int array_length(int a[]){
return 0;
}
*******/
/*******也可以
int array_length(int *a){
return 0;
}
*******/
而此时(在子函数中)再用sizeof(a),则得到的是指针的长度(这里“指针的长度”这个表述可能有问题,该怎么精确表达呢?),由于是64位的机子,地址为64位,也就是指针为64位,即8(字节) (sizeof(a[0]) 还是4, 其中a[]是int型数组) 另一方面,在子函数中另外的操作,比如拿数组名当指针用的 a++,还是和main()里面一样
#include <iostream> void length(int a[]){
cout<<sizeof(a[])<<endl;
cout<<*a++<<endl;
cout<<*a++<<endl;
cout<<*a++<<endl;
} int main(int argc, const char * argv[]) {
int a[]={,,,,,,,,,,};
length(a); return
} //输出的结果是
// 4
// 65
// 66
//
输出结果显示,子函数内还是按照首地址以及数组类型的长度来递增。
如果是排序,在子函数里面修改了地址所对应的内容,主函数再调用的时候内容也已经变了,也就是对内存中的数据进行了操作,影响了实参。所以可以不用返回数组什么的,直接用void 类型的子函数就好了。 三、
最后,总结一下解决方案
(假设有 int a[5];)
Solution 1.1:
//to get the length of the array
int length = sizeof(a)/sizeof(a[]); Solution 1.2: 如果子函数中要用到数组长度,还是如这篇文章所说:
一般是先在外面把数组长度算好了,再作为作为参数传进去。
//至于用 宏定义 / 类 等方法,以后再研究
//再加一句,能用google就不要用度娘,搜索质量高的不是一点半点,省下的时间不是一点半点。 附:
1). mac如何显示是 32位/64位机器:
2). 32位机指针为什么是4个字节 64位与32位机的区别
C++ 数组长度 以及 数组名作为参数传递给函数 以及 为什么不在子函数中求数组长度的更多相关文章
- C#中求数组的子数组之和的最大值
<编程之美>183页,问题2.14——求子数组的字数组之和的最大值.(整数数组) 我开始以为可以从数组中随意抽调元素组成子数组,于是就有了一种想法,把最大的元素抽出来,判断是大于0还是小于 ...
- 在iOS中求数组元素中最大数与最小数
之前求数组中某个数中的最大值与最小值.还真一个个比較,后来看到这种方法后,我就醉了 NSArray *testArray = [NSArray arrayWithObjects:@"-2.0 ...
- c++中求数组长度
#include <iostream> using namespace std; template <class T> int getArrSize(T& arr){ ...
- lua中求table长度
关于lua table介绍,看以前的文章http://www.cnblogs.com/youxin/p/3672467.html. 官方文档是这么描述#的: 取长度操作符写作一元操作 #. 字符串的长 ...
- lua中求table长度--(转自有心故我在)
关于lua table介绍,看以前的文章http://www.cnblogs.com/youxin/p/3672467.html. 官方文档是这么描述#的: 取长度操作符写作一元操作 #. 字符串的长 ...
- C陷阱:求数组长度
// 这是一篇导入进来的旧博客,可能有时效性问题. 程序中,当我们建立了一个int型数组:int a[]={1,2,3,4,5,6};随后我们可能需要知道它的长度,此时可以用这种方法:length = ...
- Javascript中对数组处理的函数汇总
数组类型是JS中非常常见的类型,而且JS里的数组与其他多数语言中的数组有所不同,它的数组里每一项可以存放任何一种类型的数据,也就是说数组的第一项放的是字符串,第二项可以放数字或对象都没问题.而且JS中 ...
- PHP使用array_intersect()函数求数组交集
在PHP中求数组的交集,我们可以与PHP给我们提供的现成函数:array_intersect(),其用法格式为: array array_intersect(array array1,array ar ...
- 使用JavaScript·求数组的最大值和最小值
前言 在数组中并没有提供arr.max()和arr.min()这样的方法.那么是不是可以通过别的方式实现类似这样的方法呢?那么今天我们就来整理取出数组中最大值和最小值的一些方法. 法一:其实利用 ...
随机推荐
- C# FTP远程服务器返回错误:(550) 文件不可用(例如,未找到文件,无法访问文件)
今天用代码删除FTP服务器上的目录时候,报错:远程服务器返回错误:(550) 文件不可用(例如,未找到文件,无法访问文件). 习惯性的google,不外乎以下几点: 1.URL路径不对,看看有没有多加 ...
- Interlocked.CompareExchange
class SourceManager { private SourceManager() { } private static SourceManager sourceManager; public ...
- 互联网产品团队中Web前端工程师的重要性
国内外各大互联网公司,都有UEx/d|UCD|CDC(Customer Research & User Experience Design Center)团队. 在很多公司会认为,合格的产品经 ...
- 单例(Singleton pattern)模式的七种写法
转载请注明出处:http://www.cnblogs.com/smbk/ One: public class Singleton { private static Singleton instance ...
- TreeView递归绑定无限分类数据
TreeView递归绑定无限分类数据 实现一个动态绑定,无限级分类数据时,需要将数据绑定到TreeView控件,分类表的结构是这样的: 字段 类型 Id int ParentId int Name N ...
- andriod 读取网络图片
来自:http://blog.csdn.net/jianghuiquan/article/details/8641283 Android手机上,我们常用ImageView显示图片,我们本章获取网络图片 ...
- How to copy files between sites using JavaScript REST in Office365 / SharePoint 2013
http://techmikael.blogspot.in/2013/07/how-to-copy-files-between-sites-using.html I'm currently playi ...
- 一个线程加一运算,一个线程做减一运算,多个线程同时交替运行--synchronized
使用synchronized package com.pb.thread.demo5; /**使用synchronized * 一个线程加一运算,一个线程做减法运算,多个线程同时交替运行 * * @a ...
- 【转】IOS中的release和nil
nil和release的作用: nil就是把一个对象的指针置为空,只是切断了指针与内存中对象的联系:而release才是真正通知内存释放这个对象. 所以nil并没有释放内存,只有release才回真正 ...
- 【iOS开发】UIWebView与JavaScript(JS) 回调交互
------------------------------------------------- 很多关于objc 与 js 交互的文章都比较适用于 mac开发,iOS的webview 还是有所不一 ...