数组名是什么?

本文详细解释了数组名的本质——它是数组首元素的地址,并介绍了两个特殊情况:sizeof运算和取地址操作的区别。通过实例演示,帮助读者理解数组名的真正含义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

数组是一组有序数据的集合。而数组名则相当于是对这一组数据起了一个名字。那么,大家是否有这样的一个疑问,这个数组名到底是什么?对于二维数组来说,这个数组名是否又不一样。下面我将通过下列文章为大家详细讲解。

一、数组名是什么?

数组名是数组首元素的地址。为什么这么说呢?可以通过代码来说明。

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//定义一个一维数组
	printf("%p\n", arr);//打印这个数组的数组名的地址
	printf("%p\n", &arr[0]);//打印数组的首元素的地址
	return 0;
}

程序结果:
请添加图片描述
通过程序结果可以看出,数组名的地址和数组首元素的地址是一样的。由此可以说明,数组名就是数组首元素的地址。

二、两个例外。

数组名是数组首元素的地址,但是有两个例外。
1.sizeof(数组名),数组名放进了sizeof内部,而sizeof是计算变量或数组在内存中存储空间的大小,所以这里计算的是整个数组在内存中占据的空间。
2.&数组名,数组名前加上取地址符号,这里取出的则是数组全部元素的地址。
可以用程序来更加详细的解释一下。
程序一:

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%d\n", sizeof(arr));
	return 0;
}

请添加图片描述
这里的结果是40,一个int类型是四个字节,这个数组十个int类型的元素,结果为4*10
程序二:

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%p\n",arr);
	printf("%p\n", &arr);
	return 0;
}

请添加图片描述
虽然这里的地址是一样的,但是表达的含义可完全不一样。可以通过指针+1更加详细解释,指针+1代表指针指针下一个元素的地址。

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%p\n", arr);
	printf("%p\n",arr+1);
	printf("%p\n", &arr);
	printf("%p\n", &arr+1);
	return 0;
}

请添加图片描述
arr数组名+1,跳过了一个整形的地址,即四个字节地址。
而&arr+1,跳过了一个整形数组的地址,指向这个数组后的下一个元素的地址。

总结

数组名就是数组首元素的地址,但是有两个例外,除此之外所有的数组名都代表数组首元素的地址。

指针和数组在C语言中有着密切的关系,主要体现在以下几个方面: 1. **数组名是指针**:在C语言中,数组名可以看作是指向数组第一个元素的指针。例如,假设有一个数组`int arr[5]`,那么`arr`就等同于`&arr[0]`,即指向数组第一个元素的指针。 2. **指针运算**:通过指针可以访问数组的元素。通过指针运算,可以遍历数组。例如,`*(arr + i)`等同于`arr[i]`,其中`i`是数组的索引。 3. **数组名作为函数参数**:在函数参数中,数组名会被解释为指针。例如,定义一个函数`void func(int *arr)`,调用时传入数组名`arr`,实际上是将数组的首地址传递给函数。 4. **动态数组**:通过指针可以动态分配数组。例如,使用`malloc`函数分配内存时,返回的是一个指针,可以通过这个指针来访问动态数组的元素。 以下是一个示例代码,展示了指针和数组的关系: ```c #include <stdio.h> #include <stdlib.h> void printArray(int *arr, int size) { for (int i = 0; i < size; i++) { printf("%d ", *(arr + i)); } printf("\n"); } int main() { int arr[5] = {1, 2, 3, 4, 5}; // 数组名是指针 printf("First element: %d\n", *arr); // 输出第一个元素 // 通过指针访问数组元素 for (int i = 0; i < 5; i++) { printf("%d ", *(arr + i)); } printf("\n"); // 数组名作为函数参数 printArray(arr, 5); // 动态数组 int *dynamicArr = (int *)malloc(5 * sizeof(int)); for (int i = 0; i < 5; i++) { dynamicArr[i] = i + 1; } printArray(dynamicArr, 5); free(dynamicArr); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值