C语言——对数组名的理解

一、数组名的理解

在C语言中,数组名可以被理解为指向数组首元素的指针。这意味着,当你使用数组名时,它会被自动转换为指向数组首元素的指针,即数组的第一个元素的地址。

以下是关于数组名的理解和用法:

  1. 数组名是常量:一旦数组被声明,其名称就是一个常量指针,指向数组的第一个元素。此时不能修改数组名的值,也不能将其赋值给其它数组名。
  2. 数组名与指针的区别:虽然数组名类似于指针,但它们之间有一些重要的区别。例如,数组名不能递增或递减,而指针可以。
  3. 使用数组名访问元素:你可以使用数组名来访问数组中的元素。例如,arr[0]和*arr是等价的,都是访问数组的第一个元素。
  4. sizeof运算符:当你对数组名使用sizeof运算符时,它返回整个数组的字节数,而不是指针的字节数。这是因为数组名指向整个数组,而不仅仅是指向单个元素的指针。
  5. 数组名作为函数参数:当你将数组名作为函数参数传递时,它会被自动转换为指向数组首元素的指针。因此,函数参数可以声明为指针类型或者数组类型,但它们在函数内部的行为会略有不同。

以下是关于数组名使用的简单示例:

#include<stdio.h>
//关于数组名的简单使用

int main()
{
	int arr[5] = { 1,2,3,4,5 };

	printf("&arr[0] = %p\n", &arr[0]);//数组首元素的地址
	printf("arr = %p\n", arr);//数组首元素的地址
	printf("&arr = %p\n", &arr);//数组的地址

	int len = sizeof(arr);
	printf("sizeof(arr) = %d\n", len);//整个数组的字节数

	return 0;
}

运行结果如下图所示:

 

我们需要注意的是:arr和&arr是不同的

观察以下代码:

#include<stdio.h>
//关于数组名的简单使用

int main()
{
	int arr[5] = { 1,2,3,4,5 };

	printf("arr = %p\n", arr);//数组首元素的地址
	printf("&arr = %p\n", &arr);//数组的地址

	printf("arr+1 = %p\n", arr + 1);//跳过了一个整型的字节数
	printf("&arr+1 = %p\n", &arr + 1);//跳过了一个数组的字节数

	return 0;
}

运行结果如下图所示:

通过运行结果我们可以发现:

arr+1跳过的是一个整型的字节数

&arr+1跳过的是一个数组的字节数

二、使用指针访问数组

在C语言中,我们可以使用指针来访问数组的元素。可以通过以下步骤来实现:

  1. 声明指针变量:首先,我们需要声明一个指针变量,用来存储数组的地址。
  2. 将指针指向数组:将指针指向数组的首元素。这可以通过指针变量初始化为数组名,或者将其设置为数组名的地址来实现。
  3. 使用指针访问数组元素:一旦指针指向了数组的首元素,我们就可以通过指针进行数组元素的访问。这可以通过指针的算术运算或者间接引用来完成。
#include<stdio.h>
//使用指针访问数组
int main()
{
	int arr[5] = { 0 };
	int len = sizeof(arr) / sizeof(arr[0]);
	int* p = arr;//&arr[0]

	for (int i = 0; i < len; i++)
	{
		sacnf("%d", &arr[i]);
		//等价于:
		//scanf("%d", arr + i);
		//scanf("%d", p + i);
	}

	for (int i = 0; i < len; i++)
	{
		printf("%d ", arr[i]);
		//等价于:
		//printf("%d ", *(arr + i));
		//printf("%d ", *(p + i));
		//printf("%d ", p[i]);
	}

	return 0;
}

三、一维数组传参的本质 

 在C语言中,一维数组作为函数参数传递的本质是传递数组的地址(即数组首元素的地址)。这意味着,当你将一个一维数组作为参数传递给函数时,实际上传递给函数的是数组首元素的地址,而不是整个数组的副本。

具体来说,当你声明一个函数并将一个数组作为参数传递时,该数组会被自动转换为指向其首元素的指针。因此,函数参数实际上是一个指向数组首元素的指针,而不是数组本身。这使得函数能够访问和操作原始数组中的元素,而无需进行复制,从而提高了程序的效率和内存利用率。

这种传递数组地址的方式还意味着,对数组元素的修改在函数内部是可以影响到原始数组的。这是因为函数内部使用的是原始数组的地址,所以对数组元素的任何改变都会直接反映到原始数组中。

以下是一个简单示例,演示了如何将一维数组作为函数参数传递:

#include <stdio.h>

// 函数原型,接受一个整型数组作为参数
void printArray(int arr[], int size) 
{
    for (int i = 0; i < size; i++) 
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() 
{
    int myArray[] = {1, 2, 3, 4, 5};

    // 调用函数,传递数组作为参数
    printArray(myArray, 5);

    return 0;
}

我们需要注意的是:不能在函数内部计算数组的元素个数 。数组名是数组首元素的地址,那么在数组传参的时候,本质上传递的是数组首元素的地址。想要在函数内部对数组长度进行计算时,sizeof(arr)计算的是一个元素的大小而不是数组的大小。

注:一维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。

 更多C语言相关练习:test_c: C语言练习,包括常见语法练习以及小项目练习。 (gitee.com)

  • 29
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值