C语言——简述数组作为形参和实参在函数中的传递

07-14 587阅读

1.数组作为形参被调用

在C语言中,当数组名作为函数参数被调用时,它并不传递整个数组本身,而是传递数组首元素的地址。这是因为数组名在大多数情况下(除了作为sizeof操作符的操作数或作为&操作符的操作数时)会被解释为指向数组首元素的指针。

C语言——简述数组作为形参和实参在函数中的传递
(图片来源网络,侵删)

这意味着,当你在函数中接收一个数组作为参数时,你实际上接收到的是一个指向该数组第一个元素的指针。基于这一点,你可以通过这个指针在函数内部访问和修改数组的元素。

下面是一个简单的例子来说明这一点:

#include   
  
// 函数声明,参数是一个指向整数的指针  
void printArray(int arr[], int size) {  
    for (int i = 0; i  

在这个例子中,printArray函数接收一个指向整数的指针arr和一个整数size作为参数。虽然printArray函数的声明看起来像是它接收了一个数组,但实际上它接收的是一个指向整数的指针。当myArray作为参数传递给printArray时,它传递的是myArray首元素的地址,即&myArray[0]。然后,printArray函数就可以通过这个指针遍历数组了。

这种方式非常灵活和强大,因为它允许函数操作数组,而不需要知道数组的确切大小(在这个例子中,我们通过额外的size参数来传递数组的大小)。然而,这也意味着调用者需要负责传递正确的大小,以避免越界访问等错误。

2.数组作为实参在函数中的值传递

(1)整型变量的传递

首先我们分析整型变量在函数中的传递,例如以下代码:

#include
void changeData(int data)
{
	data = data + 100;
	printf("changeData中data的地址是:%p,data=%d\n",&data,data);
}
int main()
{
	int data = 10;
	
	changeData(data);
	printf("main中data的地址是:%p,data=%d\n",&data,data);
	return 0;
}

它的输出为:

changeData中data的地址是:000000000061FDF0,data=110
main中data的地址是:000000000061FE1C,data=10

我们可以看到,虽然两个函数中的变量名一样都是data,但是他们的地址不同,就代表他们是不同的变量。main函数中的data被调用到changeData函数中,传递的只是它的值,在changeData函数中data只是一个局部变量,改变的也只是changeData函数中data的值,并不影响main函数中data的值。

(2)数组变量的传递:

接着我们再看数组的情况:

#include
void changeData(int array[])
{
	
	array[0] = array[0] + 100;
	printf("changeData中array的地址是:%p,array[0]=%d\n",array,array[0]);
}
int main()
{
	int array[] = {10};
	
	changeData(array);
	printf("main中array的地址是:%p,array[0]=%d\n",array,array[0]);
	return 0;
}

输出为:

changeData中array的地址是:000000000061FE1C,array[0]=110
main中array的地址是:000000000061FE1C,array[0]=110

我们可以看到,两个函数中数组的地址和值都是一样的,当changeData函数中的数组值被改变时,main函数中数组的值也同样发生改变。验证了我们之前提到的当数组名作为函数参数被调用时,它并不传递整个数组本身,而是传递数组首元素的地址。在同一地址上进行的操作,将会保留其变化。

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]