sizeof(数组名)和sizeof(指针)
char arr[10];sizeof(arr) =10;《C和指针》P141~142
传的是数组名,数组名不等价于地址。编译器用数组名标记数组的属性,比如具有确定数量的元素。而地址,也就是指针,只是一个标量值。只有当数组名在表达式中使用时,编译器才会为它产生一个指针常量。而只有以下两种情况,才不被当做指针常量:
sizeof(数组名):返回数组所占的字节数,不是数组元素个数,也不是指向数组的指针的长度。&数组名:产生一个指向数组的指针,而不是一个指向某个指针常量的指针。数组名并不是完全等同于指针。虽然它们都可以通过指针方式访问数组。但是数组在作为函数参数传递过程中,会退化成指针。这也是为什么指针作为参数传递时,经常要一个长度。
加上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的
新闻热点
疑难解答