5.5 函数与数组(数组实参的相关知识点)

先看一段案例:
代码如下:

#include <stdio.h>
void printData(int array[3])
{
	int i;
	printf("printData:array的大小是:%d\n",sizeof(array));
	for(i=0;i<3;i++){
		printf("%d ",array[i]);
	}
	putchar('\n');
}

int main()
{
	int array[3]={1,2,3};
	printf("main:array的大小是:%d\n",sizeof(array));
	printData(array);      //数组名当成实际参数
	return 0;
}

在编译后,编译结果如下:
5.5 函数与数组(数组实参的相关知识点)
将数组的元素改成10个元素,编译结果如下:
5.5 函数与数组(数组实参的相关知识点)
综合上述的案例,我们可以看出,形参中不存在数组的概念,即便中括号中约定了数组大小也无效。传递的只是一个地址而已,是数组的首地址(8个字节)。

而且在操作系统中,我们也是用8个字节来表示一个地址。

以上的代码可能会存在某些问题,但是我们为了验证某些东西,无伤大雅,在此,我们仍然可以看出sizeof的妙用(它是一个关键字

#include <stdio.h>
void printData(int array[],int len)
{
	int i;
	printf("printData:array的大小是:%d\n",sizeof(array));
	for(i=0;i<len;i++){
		printf("%d ",array[i]);
	}
	putchar('\n');
}

int main()
{	
	int len;
	int array[]={1,2,3,4,5,6};
	len=sizeof(array)/sizeof(array[0]);
	printf("main:array的大小是:%d\n",sizeof(array));
	printData(array,len);                                  //数组名当成实际参数
	return 0;
}

前文提到

传递的只是一个地址而已,是数组的首地址。

既然它是传递一个地址,那么我们可以直接传递第一个元素的地址即可。

#include <stdio.h>

void printData(int array[],int len)
{
	int i;
	printf("printData:array的大小是:%d\n",sizeof(array));
	for(i=0;i<len;i++){
		printf("%d ",array[i]);
	}
	putchar('\n');
}

int main()
{	
	int len;
	int array[]={1,2,3,4,5,6};
	len=sizeof(array)/sizeof(array[0]);
	printf("main:array的大小是:%d\n",sizeof(array));
	printData(array[0],len);     //数组名当成实际参数.数组名代表整个数组的首地址,同时,第一个元素的地址也是首地址。
	return 0;
}

下面,再看看两段相似代码的编译结果对比:

第一段:
1、代码:

#include <stdio.h>
void changeData(int data)
{
	data=data+100;
	printf("data的数值为%d,地址为%p\n",data,&data);
}

int main()
{
	int data=30;
	changeData(data);
	printf("data的数值为%d,地址为%p\n",data,&data);
	return 0;
}

2、编译结果:
5.5 函数与数组(数组实参的相关知识点)
从编辑结果来看,两个data的地址不同。

第二段:
1、代码:

#include <stdio.h>
void changeData(int data[0])
{
	data[0]=data[0]+100;
	printf("data的数值为%d,地址为%p\n",data[0],&data[0]);
}

int main()
{
	int data[2]={30,50};
	changeData(data);
	printf("data的数值为%d,地址为%p\n",data[0],&data[0]);
	return 0;
}

2、编译结果:
5.5 函数与数组(数组实参的相关知识点)
从编译结果来看,两个data的地址相同。

总结: 对于普通的数值,传递的是数值,但操作的是不同的内存空间。 对于数组而言,数组名当作实参,传递的是地址,即相同的内存空间。

上一篇:牛客网JZ4e二维数组中的查找(C/C++)


下一篇:中国硫代硫酸铵肥料行业市场供需与战略研究报告