c语言数组名作为参数时,本质是什么?-创新互联

我们先来介绍一种计算数组长度的方法:

成都创新互联公司专业为企业提供鲤城网站建设、鲤城做网站、鲤城网站设计、鲤城网站制作等企业网站建设、网页设计与制作、鲤城企业网站模板建站服务,10多年鲤城做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
#includeint main()
{
    int arr[10]={1,2,3,4,5,6,7,8,9,10};
    int size=sizeof(arr)/sizeof(arr[0]);
    return 0;
}

这里sizeof(arr)计算的是整个数组所占内存的大小,而sizeof(arr[0])计算的是arr[10]数组首元素所占内存的大小。这样我们可以很方便的得到数组的大小,在较大型的项目中,一个数组可能会参与多个循环。用size表示数组长度的好处是,当我们需要改变数组长度时,我们只需要改变arr本身,而不用改变循环的条件。上述代码运行就可以得到size=10

接下来进入正题:

我们把以上代码封装成函数

#includeint arr_size(int arr[])
{
    return sizeof(arr)/sizeof(arr[0]);
}

int main()
{
    int arr[10]={1,2,3,4,5,6,7,8,9,10};
    printf("%d",arr_size(arr));
    return 0;
}

再次运行,我们期待打印出的值为10,但F5运行后得到的值却不是10

这是为什么呢?查阅资料,我们发现,c语言中,函数参数中的arr[]其实就是一个指针,它指向的是首元素的地址。

#includeint arr_size(int arr[])
{
	printf("%p", arr);
	return sizeof(arr) / sizeof(arr[0]);
}

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	arr_size(arr);
	return 0;
}

用%p打印arr的地址,调试后可以发现,arr确实是首元素的地址,如下图所示

所以我们得出结论,函数中数组作参数,其本质就是一种指向数组首元素的指针,此时sizeof(arr)表示求指针的大小,在x64中为8,而sizeof(arr[0])为int型变量的大小,即为4,则前面错误代码运行的结果为8/4=2,不为10。

所以我们把函数改变一下

void arr_size(int arr[],int sz)
{
	for (int i = 0; i< sz; i++)
	{
		printf("%d", arr[i]);
	}

}

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };	
	int size=sizeof(arr) / sizeof(arr[0]);
	arr_size(arr,size);
	return 0;
}

我们也可以直接用指针作为参数

void arr_size(int *arr,int sz)
{
	for (int i = 0; i< sz; i++)
	{
		printf("%d ", *(arr+i));
	}
}

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };	
	int size=sizeof(arr) / sizeof(arr[0]);
	arr_size(arr,size);
	return 0;
}

结果同样为正确的

实际上,arr[i]就是*(arr+i)。

以上是个人关于数组名作参数的理解,谢谢你看到这里^_^

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文标题:c语言数组名作为参数时,本质是什么?-创新互联
文章网址:http://azwzsj.com/article/deodep.html