}
###### 传入数组首地址 int \*
int sum(int \* array, int size)
与上面一种其实本质上并没什么不同。
不管哪一种,只要函数内部对传入的数组进行了修改,该数组本身的值也会改变,因为传入的都是地址,可以直接对地址上存储的元素进行修改。
#include <stdio.h> int sum(int *array,int size) { int summ=0,i; for(i=0;i<size;i++) { summ+=*(array+i); } return summ; } int main() { int arr[3]={1,2,3}; int ArrSum; ArrSum=sum(arr,3);//这边传递的参数还是arr,和函数参数是数组一样 printf("%d",ArrSum);//但是这里的arr表示的是指针 return 0; }
###### 还有一种不推荐使用的传参方法
int sum(int array[20])
or
const int size = 20;
int sum(int array[size])
从效果来讲,与前面两种并无本质区别,但是容易出错,(const),而且函数内也get不到size
###### 一维数组作为参数总结
三个等价的一维数组传参方式
int sum(int \*)
int sum(int [])
int sum(int [10])
为了避免数组越界,传入size的方法:
1. 将size作为参数传入
2. 使用数组的引用避免数组降价
当参数是一个数组类型的引用时,数组长度成为参数与实参类型一部分,编译器会检查实参数组长度与形参是否匹配
int sum(int (& array )[10])
##### 二、**二维数组作为参数**
与一维数组一样,比较常用有两种传入方式,但是区别在于必须写出列数。因为数组在调用时同样有数组降价的问题,实际函数得到的是一个指针,指向行向量构成的一维数组,这样每个一维数组的size必须提前定义好,便于分配栈空间。
1. int sum(int array[][4], int size)
2. int sum(int (\*array)[4], int size)
这两种方法中size表示的都是行数,然后还有几种比较不常用的方法
#include <stdio.h> int sum(int array[][3],int size) { int summ=0,i,j; for(i=0;i<2;i++) { for(j=0;j<3;j++) { summ+=array[i][j]; } } return summ; } int main() { int arr[2][3]={1,2,3,4,5,6}; int ArrSum; ArrSum=sum(arr,6);//注意只要参数是数组的,调用的时候就写数组名就可以了,不管是一维数组还是二维数组 printf("%d",ArrSum); printf("\n%d",arr); printf("\n%d",arr[0]); return 0; }
#include <stdio.h> int sum(int *array,int size)//这边的参数是一个指向整型的指针 { int summ=0,i; for(i=0;i<size;i++) { summ+=*(array+i);//因此这边只需要一次间接寻址即可 } return summ; } int main() { int arr[2][3]={1,2,3,4,5,6}; int ArrSum; ArrSum=sum(arr[0],6);//注意这里传入的参数是arr[0]而不是arr,arr表示的是数组第一行(即arr[0])的地址,而arr[0]表示的是arr[0]]0]的地址,但是有一个奇怪的地方是arr和arr[0]的地址是一样的。 printf("%d",ArrSum); printf("\n%d",arr); printf("\n%d",arr[0]); return 0; }
#include <stdio.h> int sum(int (*array)[3],int size)//这边的参数是一个数组指针,该指针指向的是一个数组(包含了三个int型的数组) { int summ=0,i,j; for(i=0;i<2;i++) { for(j=0;j<3;j++) { summ+=*(*(array+i)+j);//深刻理解这个表达式的含义。 } } return summ; } int main() { int arr[2][3]={1,2,3,4,5,6}; int ArrSum; ArrSum=sum(arr,6);// printf("%d",ArrSum); return 0; }
##### 三、**函数返回数组**
返回输入数组的指针
这里有个容易造成错误的点,函数返回的是数组指针(指向数组的指针),但是如果返回之后指针指向的数组被销毁了呢?
提到这里,再复习一下内存空间的四个区域,栈空间、堆区间、数据区(静态区)、代码区。静态变量、全局变量是放在数据区的,作用范围是全局的,而局部变量通常位于栈空间,随着被调用函数的退出自动释放空间被销毁。
###### 一维数组,返回数组指针
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
// 要生成和返回随机数的函数
int \* getRandom( )
{
static int r[10];
// 设置种子
srand( (unsigned)time( NULL ) );
for (int i = 0; i < 10; ++i)
{
r[i] = rand();
cout << r[i] << endl;
}
return r;
}
// 要调用上面定义函数的主函数
int main ()
{
// 一个指向整数的指针,不是指向数组的指针,只是指向数组第一个元素对的指针。
int \*p;
p = getRandom();
for ( int i = 0; i < 10; i++ )
{
cout << "\*(p + " << i << ") : ";
cout << \*(p + i) << endl;
}
return 0;
}
#include "stdio.h"
#include "stdlib.h"
int \* Max(int \*arr,int n)
{
int \*a=(int \*)malloc(2\*sizeof(int));
int maxNum=0,maxIndex,i;
for (i=0;i<n;i++)
if (arr[i]>maxNum)
{maxNum=arr[i];maxIndex=i+1;}
a[0]=maxNum;a[1]=maxIndex;
return a;
}
void main()
{
int a[2]={5,2};//a[0]=5,a[1]=2;
int \*b=Max(a,2);
int i;
for(i=0;i<2;i++)
printf("b[%d]=%d\n",i,b[i]);
free(b);
}
###### 二维数组指针
#include "stdio.h" #include "stdlib.h" int **Max(int **arr,int n,int m) { int **data,i,j; data=(int **)malloc(n*sizeof(int *));//强制类型转换,将其转成二维指针。 for ( i=0;i<n;i++) data[i]=(int *)malloc(2*sizeof(int)); for ( i=0;i<n;++i) { int maxNum=0; for (j=0;j<m;++j) { //printf("arr[%d][%d]=%d ",i,j,*((int *)arr+m*i+j)); if (*((int *)arr+m*i+j)>maxNum) { maxNum=*((int *)arr+m*i+j); data[i][0]=maxNum;data[i][1]=j; } } //printf("\n"); } return data; }