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

为什么func1(&myFruit);变量前前面要加&啊?谁能结合那4个打印函数说明一下吗?#include<stdio.h>structfruit{intapple;}... 为什么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才对。
望高手能解疑。
展开
 我来答
08vino
推荐于2016-09-16 · TA获得超过536个赞
知道小有建树答主
回答量:193
采纳率:0%
帮助的人:0
展开全部
楼上都说的很不错。针对补充,我说两句
结构体名字不是指针,结构体数组的名字才是指针
就好像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看做常量指针,而不是实际存在的
梦想窗外
2009-05-15 · TA获得超过1588个赞
知道大有可为答主
回答量:1180
采纳率:0%
帮助的人:1563万
展开全部
其中%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);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Null_bd
2009-05-14 · TA获得超过503个赞
知道大有可为答主
回答量:583
采纳率:0%
帮助的人:0
展开全部
在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); 输出的是指向第一个元素的地址值
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
_whales
2012-12-29 · TA获得超过2279个赞
知道大有可为答主
回答量:1814
采纳率:85%
帮助的人:505万
展开全部
结构体是一种数据类型,数组不是一种而是0~MAXINT种数据类型,所以结构名是一个变量名,数组名是一组变量名,所以结构体变量不代表地址,数组名是地址,所以数组名是一个常量指针,数组名用取址运算符得到的是一批变量的首地址所以和数组名表示的常量指针相同。结构体是不同类型的变量的集合,形一个新的数据类型,所以结构和预定义变量一样,是一个真正的变量,所以变量名不是指针而地址也和变量一样必须用取址运算符获取。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
边介
2009-05-15 · 超过18用户采纳过TA的回答
知道答主
回答量:101
采纳率:0%
帮助的人:49.6万
展开全部
看了下你的代码和表明,
如果你说的数组变量的名字是一个指针,那么你可以试下把别的地址传给它试下,既然不能存别的地址,也能叫指针?
还有 最后那里
我没去调试一下是不是真的也输出YYYY这个地址值,
但是你可以知道指针的指针是拿指针的地址来做运算的,
int *p,**p,n=5;
*p=&n;
**p=&p;
确实p的值就是n的地址,但是p自己的地址就可以被指针的指针拿去了
&p就是指针的地址,那么现在你的那个输出我就不理解了,实际上确实是XXXX
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式