c语言中数组指针和结构体指针问题

为什么func1(&myFruit);变量前前面要加&啊?
谁能结合那4个打印函数说明一下吗?

#include <stdio.h>

struct fruit
{
int apple;
};

void func1(struct fruit *pF)
{
printf("apple = %d\n", pF->apple);
}

void func2(int *p)
{
printf("*p = %d\n", p[0]);
}

int main(void)
{
fruit myFruit;
int a[2] = {25,32};

myFruit.apple = 25;

printf("myFruit = %d\n", myFruit);
printf("myFruit = %p\n", &myFruit);

printf("a = %d\n", a);
printf("a = %p\n", &a);

func1(&myFruit);

func2(a);

}
首先谢谢各位
个人认为,结构体的名字是一个指针,数组名字也是一个指针,都指向开辟的那块内存的起始地址。
但从现在来看,结构体变量名不是一个指针,就像普通变量int myFruit 一样,编译器把&myFruit编译成确定的一个4字节地址值,每次读取这个变量就直接读这个地址对应的内存单元的值;
我们知道,数组变量的名字是一个指针,编译器开辟一个内存单元,内存单元中保存着实际数据所在的起始地址。下面出现一个问题:
假设指针a的地址是一个固定的4字节值XXXX,程序每次到XXXX这里来读取这个内存单元中的值YYYY,之后把YYYY当作地址来读取真正的数组数据。
这样printf("a = %d\n", a); 的输出结果是一个地址值YYYY,可以被理解;
但是printf("a = %p\n", &a); 的输出结果还是YYYY的值让我不能理解,个人感觉应该输出XXXX才对。
望高手能解疑。

楼上都说的很不错。针对补充,我说两句
结构体名字不是指针,结构体数组的名字才是指针
就好像int x;.....x不是指针,int x[2].....x是常量指针
同样 struct aa{};...aa x;...x不是指针,aa x[3]....x是常量指针
------------------------------------------------------
对于数组int a[2]={25,32},我们通常把a看成是指针
但实际上,这个指针并不存在的,a代表这个数组的首地址,只有才参与表达式运算时,才暂时转化为常量指针(不可更改)
所以
&a,取出的这个实际不存在的指针的地址,同数组第一个元素的地址是一样的
---------------------------------------------------
换个例子,如果你这么定义
int a[3],*p=a;
printf("%d",&p);........就是p的自身地址,类似你上面的xxxx
printf("%d",p);..........就是数组a的首地址,类似你上面的yyyy
---------------------------------------------------
总结
你定义一个普通指针p的话,p和&p是不同的
你定义一个数组a的话,a和&a是相同的,因为C中只是把a看做常量指针,而不是实际存在的
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-05-15
其中%d表示以十进制整数的形式打印数据,%p表示以十六进制的形式输出内存地址,
虽然myFruit是一个结构体变量,当以%d的格式打印时,只会输出第一项的数据,即apple的值。
&用来取一个变量的地址。
数组名即是一系列数据的首地址,下面两个语句的作用一样,都是输出一个相同的地址值。
printf("a = %d\n", a);
printf("a = %d\n", &a);

给个例子你测试一下,如果还不明白我就没办法了。
#include <stdio.h>

void main()
{
int *p;
p = (int *)&p;

printf("%d\t%d\n", p, &p);
}
第2个回答  2009-05-14
在C中用&加在变量前边表示取址,也就是函数传递的参数是变量的地址,相当于VB中的byref,而void func1(struct fruit *pF)中与之相对应的是定义了一个同等数据类型的指针(即地址变量);
printf("apple = %d\n", pF->apple); 表示输出结构pf中的成员apple的值;
printf("myFruit = %d\n", myFruit); 输出的是myFruit的地址值
printf("myFruit = %p\n", &myFruit);输出的是myFruit中存放的第一个元素的地址值
printf("a = %d\n", a); 输出的是第一个元素的数值
printf("a = %p\n", &a); 输出的是指向第一个元素的地址值
第3个回答  2012-12-29
结构体是一种数据类型,数组不是一种而是0~MAXINT种数据类型,所以结构名是一个变量名,数组名是一组变量名,所以结构体变量不代表地址,数组名是地址,所以数组名是一个常量指针,数组名用取址运算符得到的是一批变量的首地址所以和数组名表示的常量指针相同。结构体是不同类型的变量的集合,形一个新的数据类型,所以结构和预定义变量一样,是一个真正的变量,所以变量名不是指针而地址也和变量一样必须用取址运算符获取。
第4个回答  2009-05-15
看了下你的代码和表明,
如果你说的数组变量的名字是一个指针,那么你可以试下把别的地址传给它试下,既然不能存别的地址,也能叫指针?
还有 最后那里
我没去调试一下是不是真的也输出YYYY这个地址值,
但是你可以知道指针的指针是拿指针的地址来做运算的,
int *p,**p,n=5;
*p=&n;
**p=&p;
确实p的值就是n的地址,但是p自己的地址就可以被指针的指针拿去了
&p就是指针的地址,那么现在你的那个输出我就不理解了,实际上确实是XXXX
相似回答