84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
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指针的内存空间不可变。