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才对。
望高手能解疑。

第1个回答  2009-05-14
因为func1的形参为指向结构体的指针,所以调用时需加&取结构体地址
第2个回答  2009-05-14
因为func1()的参数是个指针,所以要取参数的地址!
输出的区别就是取值和取地址!
第3个回答  2009-05-15
printf("a = %p\n", &a); 改为printf("a = %d\n", &a);
相似回答