楼上都说的很不错。针对补充,我说两句
结构体名字不是指针,结构体数组的名字才是指针
就好像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看做常量指针,而不是实际存在的
其中%d表示以十进制整数的形式打印数据,%p表示以十六进制的形式输出内存地址,
虽然myFruit是一个结构体变量,当以%d的格式打印时,只会输出第一项的数据,即apple的值。
&用来取一个变量的地址。
数组名即是一系列数据的首地址,下面两个语句的作用一样,都是输出一个相同的地址值。
printf("a = %d\n", a);
printf("a = %d\n", &a);
给个例子你测试一下,如果还不明白我就没办法了。
#include
void main()
{
int *p;
p = (int *)&p;
printf("%d\t%d\n", p, &p);
}
在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); 输出的是指向第一个元素的地址值
结构体是一种数据类型,数组不是一种而是0~MAXINT种数据类型,所以结构名是一个变量名,数组名是一组变量名,所以结构体变量不代表地址,数组名是地址,所以数组名是一个常量指针,数组名用取址运算符得到的是一批变量的首地址所以和数组名表示的常量指针相同。结构体是不同类型的变量的集合,形一个新的数据类型,所以结构和预定义变量一样,是一个真正的变量,所以变量名不是指针而地址也和变量一样必须用取址运算符获取。
看了下你的代码和表明,
如果你说的数组变量的名字是一个指针,那么你可以试下把别的地址传给它试下,既然不能存别的地址,也能叫指针?
还有 最后那里
我没去调试一下是不是真的也输出YYYY这个地址值,
但是你可以知道指针的指针是拿指针的地址来做运算的,
int *p,**p,n=5;
*p=&n;
**p=&p;
确实p的值就是n的地址,但是p自己的地址就可以被指针的指针拿去了
&p就是指针的地址,那么现在你的那个输出我就不理解了,实际上确实是XXXX