作者:梦天使悠然 | 来源:互联网 | 2023-06-09 05:59
char* ss1 = "0123456789";
char ss2[] = "0123456789";
sizeof(ss1) 为4,
sizeof(ss2)为11,
为什么?
数组名不就是一个指针吗?
为何sizeof(ss2)不是4呢?
11 个解决方案
ss1是指针类型,ss2是数组类型,直接填数组名编译器会把数组首地址传过去~~
数组名不是指针!!
说数组名是指针的都是错的
你从sizeof就发现他们的不同了
数组名和指针的联系是数组名可以退化成指针(退化后数组大小就丢失了),反之不成立
虽然在效果上数组名可以等同于指向数组的指针,但是在本质上它和实际的指针是有区别的。首先,数组名只是一个符号,系统不会为它分配任何空间。其次,数组名是一个常量,它不能作为左值进行运算(自增和自减也是不允许的)。而实际指针没有这方面的限制。
数组名和指针的关系,是在表达式中体现的。
sizeof运算符,是个编译期运算符,这个运算符作用于数组名,
是求数组的占用内存单元的数量
这个表达式是个常量表达式(有些实现支持变量定义数组的大小,这种实现中不是常量表达式)
另外一处,就是 &运算符和数组名构成的表达式,这个表达式中,
&a表示数组a的地址,而不是数组名作为指针的地址
程序中并没有储存表示数组首地址的指针。
取到的不是指针的地址。
C++中,函数的数组引用参数,可以匹配数组,
所以C++中数组名,表达式中,就表现为指针,数组全体对象,两种不同形态。
C中,就没有这么复杂,除了 sizeof(a) ,&a 中表示数组全体对象外,别的表达式中,通常表现为指针
编译器会自动把数组的首地址传递过去,但数组和指针还是有区别的
数组不是指针 ,数组和指针只有作为函数行参的时候编译器才将两者视为一样的,因为编译器都会将数组的操作转换成对指针的操作,其他地方数组是数组,指针是指针