欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 数组名既可作为指针也可作为变量名

数组名既可作为指针也可作为变量名

2025/5/18 6:45:43 来源:https://blog.csdn.net/m0_61968622/article/details/148031276  浏览:    关键词:数组名既可作为指针也可作为变量名

在C语言中,数组名在不同的上下文中既可以作为指向数组首个元素的指针,也可以代表整个数组,这是由C语言的设计和语法规则决定的,下面我来详细解释一下。

1. 数组名作为指向首元素的指针

在大多数情况下,当数组名出现在表达式中时,它会被解释为指向数组第一个元素的指针。例如:

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

在表达式中使用arr时,它会被解释为指向数组arr的第一个元素的指针。例如:

int *p = arr;

这里arr被解释为指向数组第一个元素的指针(int *类型),它的值是数组第一个元素的地址。因此p指向arr[0]

再比如:

printf("%p", arr);

这里打印的也是数组第一个元素的地址。

当数组作为函数参数传递时,情况比较特殊。C语言中数组参数实际上是通过指针传递的,但声明数组参数时语法上看起来像是传递整个数组。例如:

void func(int arr[5]) {// 函数体
}

或者:

void func(int arr[]) {// 函数体
}

虽然在函数参数声明中使用了数组的形式,但实际上传递给函数的是数组的首地址。所以,在函数内部,arr被当作指向数组首元素的指针,并且函数内部无法直接获取数组的实际长度(除非通过其他方式传递长度参数)。因此,从函数声明的角度看,arr在这里代表的是整个数组的概念,但从实际传递和使用来看,它表现的是一个指向数组首元素的指针。

原理:
这是因为在C语言的设计中,数组名在大多数上下文中会被“退化”为指向数组第一个元素的指针。这种设计使得数组可以通过指针运算来访问其元素,同时也提供了方便的数组操作方式。

注意一点,数组和指针是两个东西,虽然说数组名arr是指向首元素指针,但是arr[n]能代表整个数组,即在使用sizeof(arr)表示的是整个数组的量级,如若让int *p=arrp[n]无法代表对应的数组,sizeof(p)表示的是指针的量级。

2. 数组名代表整个数组

虽然在大多数上下文中数组名被解释为指向首元素的指针,但在某些特定场景中,数组名可以代表整个数组。

2.1 数组的sizeof运算

使用sizeof运算符时,数组名表示整个数组。例如:

printf("%zu\n", sizeof(arr));

这里sizeof操作对整个数组arr起作用,返回的是整个数组占用的字节数。对于上面定义的arr,它包含5个int类型的元素,如果int占用4字节,那么sizeof(arr)会返回20,而不是指向数组第一个元素的指针的大小(通常是指针本身的大小,如8字节)。

2.2 数组初始化或全比较

在数组初始化时:

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

这里arr整体被初始化,它代表的是整个数组。

再比如进行数组的全比较时(虽然C语言不支持直接对数组进行全比较操作,但可以通过其他方式来模拟),arr也代表整个数组。

3. 总结

数组名可以作为指向首个元素的指针,是因为C语言的设计使得数组名在大多数上下文中会被自动解释为指向其第一个元素的指针。这种设计的目的是为了方便数组的操作,特别是通过指针来访问数组元素。

而数组名可以代表整个数组,主要是因为存在像sizeof操作符这样需要对整个数组进行操作的场景,以及在数组初始化、作为函数参数(从声明形式上看)等场景中,需要明确数组的整体概念。正是C语言的语法和语义设计使得数组名在不同场景下有这两种不同的表现。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词