结构体和指针
#include "stdafx.h"
#include <stdio.h>
//#include "node.h"
struct NODE
{
int a;
struct NODE *b;
struct NODE *c;
};
struct NODE nodes[5] =
{
{5,nodes+3,NULL},
{15,nodes+4,nodes+3},
{22,NULL,nodes+4},
{12,nodes+1,nodes},
{18,nodes+2,nodes+1}
};
struct NODE *np = nodes+2;
struct NODE **npp = &nodes[1].b;
int _tmain(int argc, _TCHAR* argv[])
{
//首先打印出结构体数组首地址
printf("nodes = %d\n",nodes);
printf("===========================\n");
//非法操作,因为nodes是一个地址(指针),应该使用->
//printf("nodes.a = %d\n",nodes.a);
printf("nodes[3].a = %d\n",nodes[3].a);
printf("nodes[3].c = %d\n",nodes[3].c);
printf("nodes[3].c->a = %d\n",nodes[3].c->a);
//*nodes 是指向nodes数组中的第一项
//因为nodes和nodes[0]中第一项地址相同
//所以*nodes 的值和nodes->a值是相同
printf("*nodes = %d\n",*nodes);
printf("nodes[0].a = %d\n",nodes[0].a);
//*nodes.a 注意*运算优先级小于 . 运算符
//nodes是一个地址,所以上面的写法是错误
//正确的写法应该是(*nodes).a或者nodes->a
printf("(*nodes).a = %d\n",(*nodes).a);
printf("nodes->a = %d\n",nodes->a);
//*和& 运算符优先级较低
printf("nodes[3].b->b = %d\n",nodes[3].b->b);
printf("*nodes[3].b->b = %d\n",*nodes[3].b->b);
//nodes表示数组首地址,&nodes也表示是数组首地址
printf("&nodes = %d\n",&nodes);
printf("&nodes[3].a = %d\n",&nodes[3].a);
printf("&nodes[3].c = %d\n",&nodes[3].c);
printf("&nodes[3].c->a = %d\n",&nodes[3].c->a);
printf("&nodes->a = %d\n",&nodes->a);
//*np = nodes + 2;
//np 是nodes[2] 的首地址
printf("np = %d\n",np);
printf("np->a = %d\n",np->a);
printf("np->c->c->a = %d\n",np->c->c->a);
//**npp = &nodes[1].b
//针对上面的等式 是将nodes[1].b的地址赋给 npp
//注意不是将nodes[1].b的地址赋给 *npp!!!
//弄清楚一个问题,谁指向谁
//然后再计算*npp的值 这应该还是一个地址!!
//最后计算**npp的值,这是指针最后指向的值!
printf("nodes[1].b = %d\n",nodes[1].b);
printf("&nodes[1].b = %d\n",&nodes[1].b);
printf("nodes+4 = %d\n",nodes+4);
printf("*(nodes+4) = %d\n",*(nodes+4));
printf("npp = %d\n",npp);
//printf("npp->a = %d\n",npp->a);
printf("*npp = %d\n",*npp);
printf("**npp = %d\n",**npp);
//printf("*npp->a = %d\n",*npp->a);
printf("(*npp)->a = %d\n",(*npp)->a);
//*np = nodes+2
//nodes+2是一个地址 即nodes[2]的首地址
printf("nodes+2 = %d\n",nodes+2);
printf("np = %d\n",np);
printf("&np = %d\n",&np);
printf("*(&np) = %d\n",*(&np));
printf("&np->a = %d\n",&np->a);
printf("&np->c->c->a = %d\n",&np->c->c->a);
return 0;
}