首页 > 指针和数组的区别

指针和数组的区别

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是指针还是数组


  1. 函数传参的时候,形参不是真正的数组类型,因为数组是不支持复制赋值的。形参虽然可以写出数组的形式,但其实是指针。sizeof对这样的形参计算只会当作指针来计算。在32位系统下,sizeof(p)的值为4。

  2. 而对于数组,c语言规定,数组的长度一定是常量值,在编译的时候,其实就可以知道大小。sizeof不是运行时函数,而是(类似宏的)编译系统内置处理函数,在编译的时候,会计算出sizeof(对象)的大小,然后将'sizeof(对象)'替换成数值,在编译完的文件里是没有sizeof的。

  3. 关于数组,在c/c++中有2种数组,char a[10];,这个数组对象a是在栈上分配的数组,char *p = new char[10];这是在堆上分配的数组。堆上分配的数组一般叫动态数组,长度可以是变量。而栈上的数组,就需要你好好理解这个计算机分配函数栈的机制了。当代码运行进某个函数的时候,就会分配这个函数栈的大小,这个栈的大小一定是在进入的一刻就指定好了,所以早期只能用常量来构造静态数组。但是c99标准开始支持变量,前提是这个变量是一个传入函数的形参,也就是在进入函数的时候可以确定的一个值,当然了,这种时候就不能用sizeof来计算字节大小了。

【热门文章】
【热门文章】