84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
int a[] = {1, 2, 3, 4, 5}; for (int i = 0; i < sizeof(a) / sizeof(int); i++) { }
这里的a不是代表指针吗?为什么sizeof(a)得到的大小和指针的大小不一样?是因为这个是const指针吗?还是涉及到指针和数组名的本质区别?谢谢大家。
sizeof(a)
认证高级PHP讲师
数组和指针是两种类型。数组名可以隐式转换为首元素的指针。a的类型是int[5],sizeof(a)相当于sizeof(int[5])而不是sizeof(int *)。
a
int[5]
sizeof(int[5])
sizeof(int *)
数组指针和普通指针还是有区别的,毕竟在数组定义时,就能确定其元素类型和数量
只有当编译器推断不出是数组还是普通指针时,才会按普通指针的大小计算sizeof比如函数声明,void f(int* a),因为参数a什么指针都有可能传入,编译器不可能推断出是不是数组所以sizeof(a) = sizeof(int*)
sizeof
void f(int* a)
sizeof(a) = sizeof(int*)
但是你题目这种情况,编译器能明明白白推断出a就是一个5元整型数组,所以sizeof(a) = sizeof(int[5])
sizeof(a) = sizeof(int[5])
简单讲本质区别:变量名是对内存区域的命名,在运行时是没有名字的,a和p仅在源代码和编译时有意义。a命名的内存就是 int[5]类型的 具有5个int的一块内存。p命名的就是具有 int 类型的 只有1个int指针的内存空间。a[2]在编译时就直接被翻译成了 那块内存空间的第3个单元。p[2]被翻译成 p那个int*内存空间的值取出来,加上2 得到的内存地址那个内存空间。int const p 只是限定p指向的那个只有1个int指针的内存空间不可变。
数组和指针是两种类型。
数组名可以隐式转换为首元素的指针。
a
的类型是int[5]
,sizeof(a)
相当于sizeof(int[5])
而不是sizeof(int *)
。数组指针和普通指针还是有区别的,毕竟在数组定义时,就能确定其元素类型和数量
只有当编译器推断不出是数组还是普通指针时,才会按普通指针的大小计算
sizeof
比如函数声明,
void f(int* a)
,因为参数a
什么指针都有可能传入,编译器不可能推断出是不是数组所以
sizeof(a) = sizeof(int*)
但是你题目这种情况,编译器能明明白白推断出
a
就是一个5元整型数组,所以sizeof(a) = sizeof(int[5])
简单讲本质区别:
变量名是对内存区域的命名,在运行时是没有名字的,a和p仅在源代码和编译时有意义。
a命名的内存就是 int[5]类型的 具有5个int的一块内存。
p命名的就是具有 int 类型的 只有1个int指针的内存空间。
a[2]在编译时就直接被翻译成了 那块内存空间的第3个单元。
p[2]被翻译成 p那个int*内存空间的值取出来,加上2 得到的内存地址那个内存空间。
int const p 只是限定p指向的那个只有1个int指针的内存空间不可变。