指针和数组的区别
fun( int *a)
{
sizeof(a)/sizeof(a[0]);//结果为1
}
mian()
{
int a[5];
int *p = a;
sizeof(p)/sizeof(p[0]); //结果为1
p =(int*)malloc(5*sizeof(int));
sizeof(p)/sizeof(p[0]); //结果为1
sizeof(a)/sizeof(a[0]) ; //结果为5
fun( a );
}
我知道fun函数中a只是一个指针,并不表示一个数组
但在main函数中使用a,a不也是也个指针。
好像在main中使用a和在fun中是一样的,当使用sizeof,结果却不一样
看来数组和指针还是有很多区别。那p是指针还是数组
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
函数传参的时候,形参不是真正的数组类型,因为数组是不支持复制赋值的。形参虽然可以写出数组的形式,但其实是指针。sizeof对这样的形参计算只会当作指针来计算。在32位系统下,
sizeof(p)
的值为4。而对于数组,c语言规定,数组的长度一定是常量值,在编译的时候,其实就可以知道大小。sizeof不是运行时函数,而是(类似宏的)编译系统内置处理函数,在编译的时候,会计算出sizeof(对象)的大小,然后将'sizeof(对象)'替换成数值,在编译完的文件里是没有sizeof的。
关于数组,在c/c++中有2种数组,
char a[10];
,这个数组对象a是在栈上分配的数组,char *p = new char[10];
这是在堆上分配的数组。堆上分配的数组一般叫动态数组,长度可以是变量。而栈上的数组,就需要你好好理解这个计算机分配函数栈的机制了。当代码运行进某个函数的时候,就会分配这个函数栈的大小,这个栈的大小一定是在进入的一刻就指定好了,所以早期只能用常量来构造静态数组。但是c99标准开始支持变量,前提是这个变量是一个传入函数的形参,也就是在进入函数的时候可以确定的一个值,当然了,这种时候就不能用sizeof来计算字节大小了。