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的