C++ 数组长度 以及 数组名作为参数 传递给函数

在看排序,首先是插入排序,思路理清后想用代码实现,然后问题来了:

  如何求数组长度?

如果没记错,在Java中应该是有直接可用的方法的, Python中(序列)也有.len,在C/C++中,字符串倒是有strlen() (需要#include <string.h>)

一个办法是用 sizeof()

一、首先定义数组
  int array[] = {18,10,15,7,1};
一开始想都没想就直接在子函数里面
int array_length(int a[]){
    int len = sizeof(a)/sizeof(a[0]);

    return len;
}
然而在主函数中调用的结果并不是5 ,而是8 。

如果把子函数中的代码直接用到主函数中,则能得到正确的答案 5
#include <iostream>

int main(int argc, const char * argv[]) {
    int array[]={18,10,15,7,1};
    int len = sizeof(array)/sizeof(a[0]);

    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位的机子,所以是8(字节)(sizeof(a[0]) 还是4, 其中a[]是int型数组)

另一方面,在子函数中另外的操作,比如拿数组名当指针用的 a++,还是和main()里面一样
#include <iostream>

void length(int a[]){
    cout<<sizeof(a[0])<<endl;
    cout<<*a++<<endl;
    cout<<*a++<<endl;
    cout<<*a++<<endl;
}

int main(int argc, const char * argv[]) {
    int a[]={65,66,67,68,1,1,2,10,15,7,1};
    length(a);

    return 0
}

//输出的结果是
//    4
//    65
//    66
//    67
输出结果显示,子函数内还是按照首地址以及数组类型的长度来递增。如果是排序,在子函数里面修改了地址所对应的内容,主函数再调用的时候内容也已经变了,也就是对内存中的数据进行了操作,影响了实参。所以可以不用返回数组什么的,直接用void 类型的子函数就好了。

最后,解决方案,还是如这篇文章所说:
一般是先在外面把数组长度算好了,再作为作为参数传进去。
//至于用 宏定义 / 类 等方法,以后再研究//再加一句,能用google就不要用度娘,搜索质量高的不是一点半点,省下的时间不是一点半点。

附:
1). mac如何显示是 32位/64位机器
2). 32位机指针为什么是4个字节 64位与32位机的区别
 
时间: 2024-10-13 09:32:04

C++ 数组长度 以及 数组名作为参数 传递给函数的相关文章

php数组长度怎么获取

我们可以将元素添加到数组或从数组中删除元素,那么如果我们想要知道数组中存在的元素的总长度或总数,我们就可以使用count() 或sizeof函数. 下面我们就通过简单的示例,给大家介绍php获取数组长度的方法. 方法一:count()函数 首先我们创建了一个数组,如下: 1 $array = array  ("ABC","DEF", "GHI","KLM"); 然后我们使用count函数来打印出此数组中的元素数量. 1 pri

JNI/NDK开发指南(五)——访问数组(基本类型数组与对象数组)

转载请注明出处:http://blog.csdn.net/xyang81/article/details/42346165 JNI中的数组分为基本类型数组和对象数组,它们的处理方式是不一样的,基本类型数组中的所有元素都是JNI的基本数据类型,可以直接访问.而对象数组中的所有元素是一个类的实例或其它数组的引用,和字符串操作一样,不能直接访问Java传递给JNI层的数组,必须选择合适的JNI函数来访问和设置Java层的数组对象.阅读此文假设你已经了解了JNI与Java数据类型的映射关系,如果还不了解

二维数组,矩形数组 集合

二维数组,矩形数组 集合 二维数组,矩形数组集合 一.二维数组: 一维数组----豆角 二维数组----表格 1)定义: 一维数组: 数据类型[] 数组变量名 = new 数据类型[数组长度]; 数据类型[] 数组变量名 = new 数据类型[数组长度]{1,2,3....}; 2)二维数组: 数据类型[,] 数组变量名 = new 数据类型[行数,列数]; int[,] a = new int[3,4]; 赋值: a[行下标,列下标] = 值       下标都是从0开始的 取值: a[行下标

二维数组,锯齿数组和集合

一.二维数组 二维数组:一维数组----豆角二维数组----表格 定义:1.一维数组:数据类型[] 数组变量名 = new 数据类型[数组长度];数据类型[] 数组变量名 = new 数据类型[数组长度]{1,2,3....}; 2.二维数组:数据类型[,] 数组变量名 = new 数据类型[行数,列数];int[,] a = new int[3,4]; 赋值: a[行下标,列下标] = 值 下标都是从0开始的取值: a[行下标,列下标] 题目:一个班6个人,从键盘输入每个学号语文,数学,外语成

20160423 二维数组,锯齿数组和集合

2016-04-23  20:46:26 一.二维数组: 一维数组----豆角 二维数组----表格 1)定义: 一维数组: 数据类型[] 数组变量名 = new 数据类型[数组长度]; 数据类型[] 数组变量名 = new 数据类型[数组长度]{1,2,3....}; 2)二维数组: 数据类型[,] 数组变量名 = new 数据类型[行数,列数]; int[,] a = new int[3,4]; 赋值: a[行下标,列下标] = 值       下标都是从0开始的 取值: a[行下标,列下标

返回一个整数数组中最大数组的和

一:题目内容及设计思路 1.题目: 返回一个整数数组中最大数组的和 2.要求: (1)输入一个整数数组,数组里有正数也有负数. (2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (3)求所有子数组的和的最大值.有球时间复杂度为O(n). 3.设计思路: (1)利用while循环输入各个整数,用getchar()函数判断while循环是否结束,当用户按下回车键时,即getchar()=='\n'时,跳出while循环: (2)记录下循环的次数,即数组长度: (3)调用函数Co

C语言中数组名作为参数进行函数传递

用数组名作函数参数与用数组元素作实参有几点不同. 1) 用数组元素作实参时,只要数组类型和函数的形参变量的类型一致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的.因此,并不要求函数的形参也是下标变量.换句话说,对数组元素的处理是按普通变量对待的.用数组名作函数参数时,则要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组说明.当形参和实参二者不一致时,即会发生错误. 2) 在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元.在函

把数组中的n个元素的值分别扩大5倍,要求数组名作为参数。

通过把数组名作为参数传递,实际上是把数组的地址传递给形式参数.这样在被调用函数中就可以对整个数组进行操作了,将数组名作为参数传递,调用函数和被调用函数都是对占同一块内存单元的数组进行操作. #include<stdio.h> #define N 10 void MulArray1(int *x,int n);//数组名作为参数的函数原型 void MulArray2(int *aPtr,int n);//指针作为参数的函数原型 void main() { int a[N]={1,2,3,4,5

C++获取数组长度!

一.静态数组. 比如 int int_ary[5] ,静态数组在编译的时候就知道了数组长度,这对编译器来说挺好实现的. 用得最多的大概就是sizeof了吧: 1 #define countof_macro(x) (sizeof((x)) / sizeof(x)[0]) 对于C++,可以用模板. 如果将数组作为函数形参的话,它会退化成一个指针,但是引用则不会.使用引用带来的另外一个问题就是,声明参数时必须知道数组长度——我要是知道我还费这劲干啥?解决方法就是使用模板,将数组引用的数组大小声明为模板