// Array_Parameter.cpp : Defines the entry point for the console application.
//#include "stdafx.h"struct Node 
{
int data[5];
float a;
char c;
};void print(int data[],int length)
{
int i = 0;
for(;i < length;i++)
{
printf("%d\t",data[i]);
}
}void print2(int data[])
{
int i = 0;
for(;i < sizeof(data)/sizeof(int);i++)
{
printf("%d\t",data[i]);
}
}int main(int argc, char* argv[])
{
Node node = {1,2,3,4,5,100.0,'A'};
print(node.data,sizeof(node.data)/sizeof(int));
print2(node.data);
printf("\n");
return 0;
}想打印出Node里面的data信息,用print可以,用print2就不行了,原因是print2函数里sizeof(data)
算的是一个数据的长度(4),而不是整个数组的长度,这是为什么?难道print2函数里非要传入一个length才能准确定位实参数组的元素个数么??

解决方案 »

  1.   

    这当然不行,因为sizeof是在编译时决定的,而int data[],这个在编译期根本无法计算一个正确的值。
      

  2.   

    在函数print2中,你传递的只是一个int数组类型的指针,而不是整个数组,所以用sizeof算长度的时候, 只是算的一个指针的长度,而不是一个数组的长度
      

  3.   

    int data[]
    data相当于一个指针 也就是4byte大了
      

  4.   

    对,在函数中算指针的SIZE永远是4,这也是很正常的事情,因为虽然你传进去的是char*,但对于函数来说相当于是个int
      

  5.   

    你对数组作形参还不够理解,void print2(int data[])本质就是void print2(int* data),在print2函数数里data并不是数组名,而是一个指针,比如你执行data++是合法的.而sizeof(int*)当然是4了.
      

  6.   

    个人觉得医生说得比较有道理,其他的人说的好像是对的,其实不然,这里有一个问题:
    int a[5] ={0,0,0,0,0};
    那sizeof(a)是几呢??按照楼上的某些朋友所说,a是地址,所以应该是4,其实答案是20,原因正如医生所说,现在在运行期,a的大小是已知的,就可以算出sizeof(a)的真正的值了
      

  7.   

    雅克医生说法也有点问题
    而int data[],这个在编译期根本无法计算一个正确的值。
    ==============================
    不能计算并不是原因,即使你能计算.比如写成,void print2(int data[100])
    结果还是4,因为函数就是把它当成一个指针处理.并不是能否计算的问题
      

  8.   

    雅克医生说得对,int a[5];这样的形式,sizeof(a)==5*sizeof(int),在编译期间就确定了。
      

  9.   

    数组名就是首地址,是个指针,32位的os中就是4Byte
      

  10.   

    我知道是指针,但是对于int a[5];这样的形式,a是不是指针呢?
      

  11.   

    你把a做参数传递,或者传递一个int型指针,编译器看来都一样,当然都当作int型指针处理了
      

  12.   

    //通过数组名的各种运算观察其特点和本质
    #include <stdio.h>void main()
    { int a[4]={1,2,3,4};
      int *p=a;  //1、取值运算
      printf("a=%x &a[0]=%x\n\n",a,&a[0]);      //可见a=&a[0]  //2、赋值运算
      //a=a+3;a++;a--;                          //错误,a是常量,无法对它赋值  //3、取地址运算
      printf("&a=%x\n\n",&a);                   //可见&a=a,而该单元已存放了元素a[0],故a不是变量  //4、加减运算
      printf("&a[1]=%x &a[2]=%x\n",&a[1],&a[2]);
      printf("a+1=%x a+2=%x\n\n",a+1,a+2);      //可见a也是列地址性质,与&a[i]相同  //5、长度运算
      //int i;i=a;                              //根据错误信息观察a的具体类型标识
      printf("sizeof(int[4])=%d\n\n",sizeof(int[4]));
      printf("sizeof(a)=%d\n\n",sizeof(a));     //可见a可以代表int[4]标识  /*总结:
      1.由前两点可以看出,数组名相当于一常量指针,其值为所在数组首元素的地址。
      即定义int a[N]相当于:int* const a=首址
     
      2.由第三点可看出,数组名不可能是内存中的变量,故其应为一符号常量,
      上述定义应改为:#define a 首址
     
      3.数组名既然有地址值,那么就有对应的类型,由第四点可知,p和&a[i]都是int*类型,
      p=a[i]无疑正确,但p=a也正确,这说明a的类型相容于&a[i]的类型。  4.由第5点可看出,数组名的地址类型即为数组的类型标识:int[4],上述定义应改为:
      #define a ( (int[4])首址 ),这就是数组名的本质
      程序中出现的数组名都会用它来替换,例如a[i]便会被编译为:((int[4])首址)[i]
      */}
    //本文档仅供参考