向结构数组的第一个元素,那么p[1]就是指向&a[1]的地址对吧,那么为什么
p[1].kind能够访问结构的成员呢。它不是地址吗,还有就是*p[1].kind为什么只有一个字母,而且只能访问kind,其他的话还会错误???这问题搞得我一脑子雾水,期望各位大师帮帮忙,教教小弟,我先谢过啦
#include <iostream>
#include <string>
#define Candybar Cb
using namespace std;
struct Cb
{
char kind[40];
float heavy;
int calory;
};
int main()
{
Cb a[3]=
{
{"Mocha",2.3F,350},
{"Munch",4.5F,740},
{"Flip",9.4F,1006}
};
Cb* p=new Cb[3];
p=&a[0];
cout<<p[1].kind;
return 0;
}
恩,你说的不错,但是我还有些问题,在1中你说p[0]是指针,那么我输入p[0].heavy正确,而p[0]->heavy却是错误(在我看的书中他是这样说的,“结构标识符是结构名,则使用句点操作符;如果标识符是指向结构的指针,则使用箭头操作符”),那么他不是指针吗,用箭头却没用,为什么?在2中你说“*p[1].kind就是p[1]中*kind,是结构体p[1]中kind数组中第一个元素”,现在我明白p[1]不是指针,那么是不是程序自动的把*移交给了kind?
追答第一点,我没说p[0]是指针呀,我说p是指针,指向首地址,此时*p等同于p[0],是数组中的第一个元素,即p[0]是数据,不是指针,但我的话中仍有一个错误,应该是“p[n]则是该数组的第n+1(不是第n个)个元素”,当执行cout<<*p[1].kind;时输出的M其实是第二个即“Munch”的M,不是"Mocha"的M,
第二点,我不太清楚你所问的问题,怎么个“程序自动的把*移交给了kind”,不好意思请说清楚点
我根据自己的理解说一下,当kind是一个数组名时,cout<<kind 会将整个数组输出,cout<<*kind,将第一个元素输出,cout<<[n] 会将第n+1个元素输出
哦,是这样的,那么就是说p指向3个相连的内存块,分别是p[0],p[1],p[2],即3个相连的地址(两两相差类型字节数),那么我第2个问题,现在的理解是p[1].kind和*p[1].kind的区别在于前一个是地址去访问kind数组(那么当它输出完char型字符串后即停止,这是自己想的),所以输出了Munch,而后一个却是用一个结构对象(对不?)去访问kind数组却输出了M?,不好意思,比较笨,又拐住了,用地址和结构对象去访问为什么有这么大的区别
追答不是的,比如说int a=1;int* p=&a; 这个&是取址符,当加在一个数据前,表示这个数据的地址,同理,相应的是*符,当加在一个指针前,表示这个指针指向的数据,故 此时 *p等同于a,值为1,p等同于&a(要清楚p是个指针,a是个数据);在这上面这个程序中,kind是指向数组第一个元素的指针,所以,*kind表示第一个元素,所以是输出了M,明白了吗
我现在才刚学指针,在我的意识里只知道能将变量的地址赋给指针,而不知道可以直接赋值?