数组名与指针区别以及更多

本文详细解析了C语言中数组与指针的区别,尤其是sizeof运算符在处理数组名和指针时的不同表现。通过具体示例展示了数组名并非完全等同于指针,并解释了为何数组作为函数参数时会退化为指针。

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

sizeof(数组名)和sizeof(指针)

char arr[10];
sizeof(arr) =10

《C和指针》P141~142

传的是数组名,数组名不等价于地址。编译器用数组名标记数组的属性,比如具有确定数量的元素。而地址,也就是指针,只是一个标量值。只有当数组名在表达式中使用时,编译器才会为它产生一个指针常量。而只有以下两种情况,才不被当做指针常量:

  • sizeof(数组名):返回数组所占的字节数,不是数组元素个数,也不是指向数组的指针的长度。
    //3.11注:char a[8]={“water”};sizeof(a)=8,字符串数组后未初始化元素值为’\0’
  • &数组名:产生一个指向数组的指针,而不是一个指向某个指针常量的指针。

数组名并不是完全等同于指针。虽然它们都可以通过指针方式访问数组。但是数组在作为函数参数传递过程中,会退化成指针。这也是为什么指针作为参数传递时,经常要一个长度。

加上sizeof是算符,strlen是函数。
也就说明了为什么,数组做sizeof的参数不退化,传递给strlen就退化为指针了。

借用一个前辈的test:

#include<iostream>  
using namespace std;  
void fun(int *P)  
{  
    cout<<"在函数中"<<sizeof(P)<<endl;  
}  
int main()  
{  
    int A[10];  
    int* B=new int[10];  
    cout<<"数组名"<<sizeof(A)<<endl;  
    cout<<"指针"<<sizeof(B)<<endl;  
    fun(A);  
}  

结果输出:
数组名40
指针4
在函数中4

strlen和sizeof区别总结:传送门

char *a 与char a[] 的区别 以及内存基础:链接

最后提一下,strlen是碰到字符串结束符\0就返回,但是不包括\0的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值