您的位置:首页 > 编程语言 > C语言/C++

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

2017-03-05 23:07 232 查看
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的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sizeof 指针 c语言
相关文章推荐