一直都没有搞清楚的问题,估计很多人都没有搞清楚!!!

nwpulipeng 2004-12-02 04:09:56
// 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才能准确定位实参数组的元素个数么??
...全文
276 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
huyansoft 2004-12-06
  • 打赏
  • 举报
回复
//通过数组名的各种运算观察其特点和本质
#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]
*/

}
//本文档仅供参考
flyingscv 2004-12-03
  • 打赏
  • 举报
回复
你把a做参数传递,或者传递一个int型指针,编译器看来都一样,当然都当作int型指针处理了

nwpulipeng 2004-12-03
  • 打赏
  • 举报
回复
我知道是指针,但是对于int a[5];这样的形式,a是不是指针呢?
ChaseTheSun787 2004-12-03
  • 打赏
  • 举报
回复
it's too simple.
coohai 2004-12-03
  • 打赏
  • 举报
回复
这些都是小问题,建议好好跟踪一下,看看是怎么回事!
不要认为别人都不会!!!自己要多动手!!!!
这是程序员应该会做的!!!
huyansoft 2004-12-03
  • 打赏
  • 举报
回复
高手站出来,把这段程序反编译一下!!!
hzhxxx 2004-12-02
  • 打赏
  • 举报
回复


计算的是指针 的长度,不是你的数组所有值占据的位数
carmacher 2004-12-02
  • 打赏
  • 举报
回复
数组名就是首地址,是个指针,32位的os中就是4Byte
hundlom 2004-12-02
  • 打赏
  • 举报
回复
要举例子的话,就用楼主自己的很合适
hundlom 2004-12-02
  • 打赏
  • 举报
回复
这个问题在《高质量c/c++编程》里都有了,在用数组作为参数传递变量的时候,数组自动退化为同类型的指针。
Mr_Ldh 2004-12-02
  • 打赏
  • 举报
回复
雅克医生说得对,int a[5];这样的形式,sizeof(a)==5*sizeof(int),在编译期间就确定了。
SatanLi1982 2004-12-02
  • 打赏
  • 举报
回复
呵呵,我是一直不懂^_^
今天懂了
koko1998 2004-12-02
  • 打赏
  • 举报
回复
应该就是指针的size,大小是4
oyljerry 2004-12-02
  • 打赏
  • 举报
回复
按32位系统,指针的大小是4
i_love_star 2004-12-02
  • 打赏
  • 举报
回复
雅克医生说法也有点问题
而int data[],这个在编译期根本无法计算一个正确的值。
==============================
不能计算并不是原因,即使你能计算.比如写成,void print2(int data[100])
结果还是4,因为函数就是把它当成一个指针处理.并不是能否计算的问题
nwpulipeng 2004-12-02
  • 打赏
  • 举报
回复
个人觉得医生说得比较有道理,其他的人说的好像是对的,其实不然,这里有一个问题:
int a[5] ={0,0,0,0,0};
那sizeof(a)是几呢??按照楼上的某些朋友所说,a是地址,所以应该是4,其实答案是20,原因正如医生所说,现在在运行期,a的大小是已知的,就可以算出sizeof(a)的真正的值了
huyansoft 2004-12-02
  • 打赏
  • 举报
回复
你对数组作形参还不够理解,void print2(int data[])本质就是void print2(int* data),在print2函数数里data并不是数组名,而是一个指针,比如你执行data++是合法的.而sizeof(int*)当然是4了.
bobob 2004-12-02
  • 打赏
  • 举报
回复
高质量c++变成指南里面有很详细的解释

还有,自己不会就不要推测别人都不会
laowang456 2004-12-02
  • 打赏
  • 举报
回复
对,在函数中算指针的SIZE永远是4,这也是很正常的事情,因为虽然你传进去的是char*,但对于函数来说相当于是个int
beyondtkl 2004-12-02
  • 打赏
  • 举报
回复
int data[]
data相当于一个指针 也就是4byte大了
加载更多回复(2)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧