结构体指针

  指针结构与指针的关系亦有两重:其一是在定义结构时,将指针作为结构中的一个成员;其二是指向结构的指针(称为结构指针)。

前者同一般的结构成员一样可直接进行访问,后者是本节讨论的重点。

结构指针说明的一般形式是:
      struct (结构类型名称) * (结构指针变量名);
例如:struct date * pdate, today;
说明了两个变量,一个是指向结构date的结构指针pdate,today是一个date结构变量。

语句:

struct date{

      int year;

      int month;

      int day;

      };
pdate = &today; 

通过结构变量today访问其成员的操作,也可以用等价的指针形式表示:
      today.year = 2001;  等价于  (*pdate).year = 2001;
由于运算符"*"的优先级比运算符"."的优先级低,所以必须有"( )"将*pdate括起来。若省去括号,则含义就变成了"*(pdate.year)"。

在C语言中,通过结构指针访问成员可以采用运算符"->"进行操作,对于指向结构的指针,为了访问其成员可以采用下列语句形式:

      结构指针->成员名;

这样,上面通过结构指针pdate访问成员year的操作就可以写成:

      pdate->year = 2001;

如果结构指针p指向一个结构数组,那么对指针p的操作就等价于对数组下标的操作。

  结构指针是指向一种结构类型的指针变量,它是结构体在内存中的首地址。

结构指针具有一般指针的特性,如在一定条件下两个指针可以进行比较,也可以与整数进行加减。

但在指针操作时应注意:进行地址运算时的放大因子由所指向的结构的实际大小决定。

例1:用结构指针改写加密程序。

#include "stdio.h"

struct table{
char input;
char output;
}; /* 建立加密对照表 */
struct table translate[ ]={ 'a', 'd', 'b', 'w', 'c', 'k', 'd', ';' , 'e', 'i',
'i', 'a', 'k', 'b', ';', 'c', 'w', 'e'
};
/*主函数*/
main( )
{
char ch;
/* p和pend为指向结构table的指针 */
struct table *p;
struct table *pend;
/* pend指向结构数组translate的最后一个元素 */
pend = & translate[ sizeof(translate)/sizeof(struct table)- ]; while ((ch=getchar( )) != '/n')
{
for (p=translate ; p->input!=ch && p!=pend; p++);
if (p->input == ch)
putchar(p->output);
else
putchar(ch);
}
}

读者可以将两个程序对照阅读,体会结构指针特点。程序中用pend指向数组的最后一个元素。

由于结构指针和在结构中将指针作为成员,使得对于结构变量的运算和对成员的操作变得较为复杂。

由于取内容的"*"与"."和"->"运算符的优先级与结合性不同,使得对成员的访问和操作又增加了一层难度,

再因为"++"和"--"运算所具有的"先操作"与"后操作"的特性,

以及"++"和"--"运算的结合性,使得"++"和--"运算与结构操作混合在一起时,实际操作会更为复杂。

(C)struct结构体指针的更多相关文章

  1. 解惑结构体与结构体指针(struct与typedef struct在数据结构的第一道坎)

    /* 数据结构解惑01  在数据结构中会看到 typedef struct QNode { QElemType data; //数据域 struct QNode *next; //指针域 }QNode ...

  2. C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用

    类型 普通指针 指针数组(非指针类型) 数组指针 结构体指针 函数指针 二重指针 定义方式 int *p; int *p[5]; int (*p)[5]; int a[3][5]; struct{.. ...

  3. C# Struct结构体里数组长度的指定

    typedef struct Point{ unsigned short x; unsigned short y; }mPoint;//点坐标 typedef struct Line{ mPoint ...

  4. ctypes 操作 python 与 c++ dll 互传结构体指针

    CMakeLists.txt # project(工程名) project(blog-3123958139-1) # add_library(链接库名称 SHARED 链接库代码) add_libra ...

  5. python 传递结构体指针到 c++ dll

    CMakeLists.txt # project(工程名) project(xxx) # add_library(链接库名称 SHARED 链接库代码) add_library(xxx SHARED ...

  6. 【C语言入门教程】7.3 结构体指针的定义和引用

    C 语言中指针的操作非常灵活,它也能指向结构体变量对结构体变量进行操作.在学习结构指针之前,需要再次加深对指针的认识.声明指针变量时所使用的数据类型修饰符实际上的作用是定义指针访问内存的范围,如果指针 ...

  7. (三)结构体指针、sizeof

    (一)结构体指针定义 今天上班写了一段测试代码,结果在linux下编译出现段错误,刚开始一直找不到原因,后来找了度娘才搞懂了.我先贴出来第一次写的代码以及gcc编译器下报的错误: #include&l ...

  8. c语言结构体指针初始化

    今天来讨论一下C中的内存管理. 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左 ...

  9. 通过 struct 成员地址 获取 struct 结构体地址

    1. 问题描述: 现在定义了一个结构体: struct Foo { int a; int b; }; Foo foo; 假如由于函数传参等原因,现在程序只能拿到 foo.b 的地址,这时想通过某种方法 ...

随机推荐

  1. java中线程切换的开销

    思路: 开三个线程A,B,C 线程A不断的调用LockSupport.park()阻塞自己,一旦发现自己被唤醒,调用Thread.interrupted()清除interrupt标记位,同时增加自增计 ...

  2. (39)C#Ping类

    一.Ping类 引用命名空间 using System.Net.NetworkInformation 控制台版 using System; using System.Collections.Gener ...

  3. Spring Boot + Elastic stack 记录日志

    原文链接:https://piotrminkowski.wordpress.com/2019/05/07/logging-with-spring-boot-and-elastic-stack/ 作者: ...

  4. FMDB使用Cached Statement功能

    FMDB使用Cached Statement功能   在FMDB中,Cached Statement功能是一种提高SQLite数据库访问的技术.在SQLite中,所有的SQL语句都会被编译,形成预处理 ...

  5. shell细节决定高度

    1.文件测试操作符 -f[file]:文件存在且为普通文件则为真; -d[directory]:文件存在且为目录文件则为真; -s[size]:文件存在且为文件大小不为0则为真; -e[exist]: ...

  6. 文艺平衡树(Splay)

    题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...

  7. andriod Java中度转度分秒

    public String trandu2m(double d) { //gisoracle 编号 try { //double dd = Convert.ToDouble(str); String ...

  8. WMS8_基本操作

    建立分拣[收货.出货.领料]         点击仪表盘上的任何一个 All operations 链接切换至分拣 列表视图         点击 creae 按钮,建立一个新的分拣     part ...

  9. JSP技术基础(动态网页基础)

    前言:如果说html为静态网页基础,那么jsp就是动态网页基础,两者的区别就是jsp在html的前面多加了几行而已.当然,jsp里面对java的支持度更高.要明白,js只是嵌入在客户端的小程序小脚本而 ...

  10. IDA断点和搜索

    一.断点 调试很重要一点是下断点,看看IDA提供的功能,本来已经和WinDbg一样强了. 官方文档的变化 Edit breakpoint Action name: BreakpointEdit Con ...