(C)struct结构体指针
结构体指针
指针结构与指针的关系亦有两重:其一是在定义结构时,将指针作为结构中的一个成员;其二是指向结构的指针(称为结构指针)。
前者同一般的结构成员一样可直接进行访问,后者是本节讨论的重点。
结构指针说明的一般形式是:
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结构体指针的更多相关文章
- 解惑结构体与结构体指针(struct与typedef struct在数据结构的第一道坎)
/* 数据结构解惑01 在数据结构中会看到 typedef struct QNode { QElemType data; //数据域 struct QNode *next; //指针域 }QNode ...
- C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用
类型 普通指针 指针数组(非指针类型) 数组指针 结构体指针 函数指针 二重指针 定义方式 int *p; int *p[5]; int (*p)[5]; int a[3][5]; struct{.. ...
- C# Struct结构体里数组长度的指定
typedef struct Point{ unsigned short x; unsigned short y; }mPoint;//点坐标 typedef struct Line{ mPoint ...
- ctypes 操作 python 与 c++ dll 互传结构体指针
CMakeLists.txt # project(工程名) project(blog-3123958139-1) # add_library(链接库名称 SHARED 链接库代码) add_libra ...
- python 传递结构体指针到 c++ dll
CMakeLists.txt # project(工程名) project(xxx) # add_library(链接库名称 SHARED 链接库代码) add_library(xxx SHARED ...
- 【C语言入门教程】7.3 结构体指针的定义和引用
C 语言中指针的操作非常灵活,它也能指向结构体变量对结构体变量进行操作.在学习结构指针之前,需要再次加深对指针的认识.声明指针变量时所使用的数据类型修饰符实际上的作用是定义指针访问内存的范围,如果指针 ...
- (三)结构体指针、sizeof
(一)结构体指针定义 今天上班写了一段测试代码,结果在linux下编译出现段错误,刚开始一直找不到原因,后来找了度娘才搞懂了.我先贴出来第一次写的代码以及gcc编译器下报的错误: #include&l ...
- c语言结构体指针初始化
今天来讨论一下C中的内存管理. 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左 ...
- 通过 struct 成员地址 获取 struct 结构体地址
1. 问题描述: 现在定义了一个结构体: struct Foo { int a; int b; }; Foo foo; 假如由于函数传参等原因,现在程序只能拿到 foo.b 的地址,这时想通过某种方法 ...
随机推荐
- Web前端入门知识
第一阶段:理论知识 第一章:协议理解 第二阶段:了解知识 第二章:前端简介 第三阶段:入门知识 第三章:标签结构 第四章:常用标签 第四阶段:样式搭配 第五章:样式初见 第六章:属性选择 第七章:属性 ...
- luogu P2894 [USACO08FEB]酒店Hotel
题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a ...
- [Bzoj5358][Lydsy1805月赛]口算训练(预处理+动态开点线段树)
5358: [Lydsy1805月赛]口算训练 Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 318 Solved: 105[Submit][Stat ...
- Silverlight 离线安装包
直接下载地址 https://www.microsoft.com/getsilverlight/locale/en-us/html/Microsoft%20Silverlight%20Release% ...
- mac升级系统自带numpy失败解决方案
sudo pip install -U numpy 后抛出 OSError: [Errno 1] Operation not permitted: '/tmp/pip-o2xinZ-uninstall ...
- TCP通过滑动窗口和拥塞窗口实现限流,能抵御ddos攻击吗
tcp可以通过滑动窗口和拥塞算法实现流量控制,限制上行和下行的流量,但是却不能抵御ddos攻击. 限流只是限制访问流量的大小,是无法区分正常流量和异常攻击流量的. 限流可以控制本软件或者应用的流量大小 ...
- python+OpenCV进行人脸检测【转】
OpenCV的人脸检测功能在一般场合还是不错的.而ubuntu正好提供了python-opencv这个包,用它可以方便地实现人脸检测的代码. 写代码之前应该先安装python-opencv: $ su ...
- mt-checklist 的 bug 解疑 及 防止 this 指针偏移
1.今天在使用 mt-checklist 时,发现 绑定 change 方法后,第一次点击返回的值为 空数组 <template> <div id="app"&g ...
- Node.js Express 框架 Express
Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具. 使用 Express 可以快速 ...
- Android开发之裁切(拍照+相冊)图像并设置头像小结
先看效果: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5 ...