// 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才能准确定位实参数组的元素个数么??
//#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才能准确定位实参数组的元素个数么??
解决方案 »
- 带 \0 的存 unicoed 的 char[] 转 CString
- win7下如何创建系统进程
- 有哪位给给出一个键盘钩子的详细制作过程?感激不尽,请吃饭!
- 游戏修改中内存地址问题
- 怎样转换CString->char* ?
- psapi GetProcessMemoryInfo()中没有当前程序使用的虚拟内存的大小? 哪里可以拿到当前程序使用的虚拟内存的大小?
- 单文档视图中如何加载一个ListView,请大家帮一下忙,给我指点一下!
- 能不能获得MsFlexGrid控件的IDispatch接口指针??
- 1200百分求解,请进
- 请问哪里有c/c++/vc的库函数资料可下载或购买!(急)
- 我发现了msdn里面的一个错误,你们看看是不是这样:
- MoveWindow()函数错误
data相当于一个指针 也就是4byte大了
int a[5] ={0,0,0,0,0};
那sizeof(a)是几呢??按照楼上的某些朋友所说,a是地址,所以应该是4,其实答案是20,原因正如医生所说,现在在运行期,a的大小是已知的,就可以算出sizeof(a)的真正的值了
而int data[],这个在编译期根本无法计算一个正确的值。
==============================
不能计算并不是原因,即使你能计算.比如写成,void print2(int data[100])
结果还是4,因为函数就是把它当成一个指针处理.并不是能否计算的问题
#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]
*/}
//本文档仅供参考