从C开始_结构体_结构指针

 从C开始_结构体_结构指针


其实说实话,我们用久了指针的人就会慢慢喜欢上指针,而我们结构体中也有指针来指向结构。我觉得至少有这么几个原因阐述我为什么喜欢用指针来只想结构。


第一,就像指向数组的指针比数组本身更容易操作。
第二,其实在早期的C实现中,结构不能作为参数被传递给函数,而指向结构的指针却可以;
第三,其实很多奇特的数据表示都是使用了包含指向其他结构的指针的结构


———————————————————————————————————————————————————
#include<stdio.h>
#define LONG 20
struct names{			                  /*名字是由俩个单词构成的 这是第一个结构 */ 
	char first[LONG];
	char last[LONG];
};
struct guy {                                      /*第二个结构,也是主结构*/ 
    struct names handle;                          /* 吧第一个结构嵌入进去了 */ 
    char favfood[LONG]; 
    char job[LONG]; 
    float income; 
};  
int main (void) 
{ 
    struct guy fellow[2] =                        /*初始化结构数组*/
  {    
      {
	    {"Ewen", "Villard"}, 
        "grilled salmon",     
        "personality coach",  
        58112.00              
      },
      {
      	{"Rondy","Swillbelly"},
      	"tripe",
      	"tabloid editor",
      	232400.00
      }
  };
	struct guy * him;                                 /*这是一个只想结构的指针*/
	printf("address #1 : %p #2 : %p\n", &fellow[0], &fellow[1]);
	him = &fellow[0];
	printf("address #1 : %p #2 : %p\n", him, him + 1);
                                                           /*这三条程序是为了验证him是否被成功指向结构*/
	printf("him->income is $%.2f: (*him).income is $%.2f\n", him->income, (*him).income);
	him++; //指向下一个结构
	printf("him->income is $%.2f: (*him).income is $%.2f\n", him->income, (*him).income);
	return 0;
}
 



———————————————————————————————————————————————————


一样,我们看看输出成什么样吧:
address #1 : 0028FE34 #2 : 0028EF88
address #1 : 0028FE34 #2 : 0028EF88
him->income is $58112.00: (*him).income is $58112.00
him->income is $232400.00: (*him).income is $232400.00


可能你们输出的话地址不一样,但这不重要,前俩行就如我在程序里注释的一样,起到的就是验证him是否成功指向了结构,也就是说,只要第一行和第二行对于相同就行了。


好吧,我们先来看看 怎么创建一个指向guy结构的指针吧;
声明很简单:
struct guy * him;
①关键字struct;②结构标记的guy;③是然后是 * 加上指针名,这个语法和我们见过的其他指针声明是一样的;
[注意:这个声明不是建立以个新的结构,而是说明指针him现在可以指向任何现有的guy类型的结构,假如存在shabi这么一个guy类型的结构,我们可以这么指向:
    him = &shabi
       和数组不一样,一个结构的名字不是这个结构的地址,因此我们不能如数组一样直接用him = shabi,而是需要在结构名前面加上&运算符;
       在这次的例子里面,fellow是一个结构数组,也就是说fellow[0]是一个结构,说以我们写代码把him指向fellow[0],从而初始化了him
him = &fellow[0];
而头俩行就表明我们成功地执行了这一个语句,him指向的是fellow[0]而him+1指向的是fellow[1],但要注意的是再him上加1相当于地址上加了84!
为什么这么说呢,我们来看看,其实一个guy结构就占了84位字节的内存区域!
————————————————————————————————————————————————————
之后我们再说说我们是怎么 用指针访问我们的成员
指针him在初始化之后指向的是fellow[0]。那我们是怎么把这个him用起来获取每一个成员的呢?
我们用了俩种方法来完成①使用箭头(外形酷似箭头,咱就先这么叫着啊),一个新的运算符->是由一个减号和一个大于符号组成,这样吧这么说:
him->income  is  fellow[0].income  if  hie == fellow[0]
相比较第二个方法
(*him).income——在这里我们必须要用上圆括号因为在定义上点运算符要比*更高级!
这个还比较好理解吧,*him == fellow[0]    so  (*him).income == fellow[0].income
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值