设为首页 加入收藏

TOP

C语言复习之结构体和指针(一)
2013-09-24 09:24:38 来源: 作者: 【 】 浏览:434
Tags:语言 习之 结构 指针

  一前言:

  1>下面所用到的实例为:

  typedef  struct {

  int     a;

  short   b ;

  }Ex2;

  typedef  struct EX  {

  int   a;

  char  b ;

  Ex2   c;

  struct  EX  *d;

  }EX;

  2>类型为EX的结构可以用下面的图表示:

  3>可以用下列的方法进行声明:

  Ex  x = {10,”hi”,{5,{-1,25}},0};

  Ex  *px = &x;

  二.访问指针

  1.表达式px的右值是:

  px是一个指针变量,但此处并不存在任何间接访问操作符,所以这个表达式的值就是px的内容。

  2. 表达式px的左值是

  1>它表示了px的旧值将被一个新值所取取代

  现在考虑表达式px+1。这个表达式并不是一个合法的左值,因为它的值并不存储于任何可标识的内存位置。

  2>px+1的右值:如果px指向一个结构数组的元素,这个表达式将指向该数组的下一个结构。但,就算如此,这个表达式任然是非法的,因为我们没有办法分辨内存下一个位置所存储的是这些结构元素之一还是其他东西。

  三.访问结构

  可以使用*操作符对指针执行间接访问。

  1.表达式*px右值是px所指向的整个结构

  间接访问操作随箭头访问结构,所以使用实现显示,其结果就是整个结构。

  1>你可以把这个表达式赋值给另一个类型相同的结构,2>你也可以把它作为点操作符的左操作数,访问另一个指定的成员。

  3>你可以把它作为参数传递给函数,也可以把它作为函数的返回值返回(但是 :这样做效率不高)

  2.表达式*px的左值是:

  1>此处,该结构将接受一个新值,或者更准确的说,它将接受它的所有成员的新值。作为左值,重要的是位置,而不是这个位置所保存的值。

  2>表达式*px+1是非法的,因为*px的结果是一个结构。C语言没有定义结构和整型值之间的加法运算。

  3>但是*(px+1),如果x是一个数组的元素,这个表达式表示它后面的那个结构。但是,x是一个标量,所以这个表达式实际上是非法的。

  四结构的存储分配

  结构在内存中是如何分配呢?

  1.编译器按照成员列表顺序一个接一个地给每个成员分配内存。只有当存储成员时需要满足正确的边界对齐要求时,成员之间才可能出现用于填充的额外内存空间。

  2.sizeof操作符能够得出一个结构的整体长度,包括因边界对齐而跳过的那些字节。

  3.如果要确定结构中某个成员的实际位置,可以使用offsetof宏(stddef.h)

  offsetof(type,member);

  type是结构的类型,member是该结构的成员名,表达式的结构是一个sizeof_t值。表示该指定成员的存数位置(离该结构体存储的起始位置)

  eg:

  #include<stdio.h>

  #include<stdlib.h>

  #include<stddef.h>

  struct  tiger {

  char a;

  int  b;

  char c;

  };

  int  main()

  {

  struct  tiger x;

  int  m;

  m = offsetof(struct tiger,b);

  printf(“%d\n”,m);

  }

  该程序输出结构为4

  五.作为函数参数的结构

  结构标量是一个标量,它可以用于其他标量可以使用的任何场合。因此,把结构作为参数传递给一个函数是合法的,但这种做法往往不适宜。

  1.下面的程序用于操作电子现金收入记录机。下面是一个结构的声明。

  typedef  struct {

  char  product[PRODUCT_SIZE];

  int   quantity;

  float  unit_price;

  float  total_amount;

  }Transaction;

   

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言中表驱动编程(动态加载) 下一篇详解sizeof操作符

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: