结构体和指针

结构体和指针

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值