(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 的地址,这时想通过某种方法 ...
随机推荐
- (2)html 块类
span span是内联元素,内联元素的特点:在显示时通常不会以新行开始 div div是块级元素,块级元素会换新行 class 设置 <head> <style> .citi ...
- 关于udo3d双目相机的嵌入式板子系统重装
遇到的问题: 1.下载压缩文件(.rar):在linux下下载一会就会停止 原因:linux下不支持.rar文件的下载,在windows下载即可 2.在windows下解压文件,结果为镜像文件(.im ...
- sshpass结合ssh和scp可以自动完成密码登录,无需手动输入密码
使用方法: 1.sshpass -p 123456 ssh admin@1.1.1.1 "touch file" 远程创建文件file 2.sshpass -p 123456 s ...
- 【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】
[002-Add Two Numbers (单链表表示的两个数相加)] 原题 You are given two linked lists representing two non-negative ...
- Scala 基础新手教程
1.前言 近期在參加Hadoop和Spark培训.须要使用Scala,自学了一下作为入门.这里作一个记录. 2.下载 1) 在scala官网下载.地址: http://www.scala-lang.o ...
- C++11 并发指南五(std::condition_variable 详解)(转)
前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread,std::mut ...
- AngularJs 常用
Angularjs开发一些经验总结:http://www.cnblogs.com/whitewolf/archive/2013/03/24/2979344.html 七步从AngularJS菜鸟到专家 ...
- vs2012停止调试长时间不响应问题解决方法
在vs2012命令提示符下,运行devenv.exe /resetuserdata又一次设置下环境解决.
- 使用Caffe完成图像目标检测 和 caffe 全卷积网络
一.[用Python学习Caffe]2. 使用Caffe完成图像目标检测 标签: pythoncaffe深度学习目标检测ssd 2017-06-22 22:08 207人阅读 评论(0) 收藏 举报 ...
- alexNet--deep learning--alexNet的11行代码
% Copyright 2016 The MathWorks, Inc. clear camera = webcam( 2 ); % Connect to the camerannet = ale ...