(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)-1 ];

    while ((ch=getchar( )) != ‘/n‘)
    {
        for (p=translate ; p->input!=ch && p!=pend; p++);
        if (p->input == ch)
                putchar(p->output);
        else
                putchar(ch);
    }
}

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

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

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

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

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

时间: 2024-12-22 07:47:04

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

结构体指针

结构体与指针 1.结构体指针的数值为某个结构体的内存空间的地址,从而指针指向某个结构体. 2.结构体指针的初始值为空(0),不指向任何结构体. 3.malloc操作:创建一个新的内存空间(从内存中选择一个内存空间存储结构体),p指向这个结构体,p的值为这个结构体的内存空间的地址. 4.结构体指针的赋值:一个结构体指针的数值等于另外一个结构体指针的数值,从而两个结构体指针指向相同的结构体.当对某个结构体进行访问时,选择的结构体指针只要满足该结构体指针指向这个结构体即可,即可以有很多种选择. 5.当

c语言中结构体指针

1.指向结构体的指针变量: C 语言中->是一个整体,它是用于指向结构体,假设我们在程序中定义了一个结构体,然后声明一个指针变量指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到指向运算符"->". 举例说明: struct SunLL { int a; int b; int c; }; struct SunLL  * p;               //定义结构体指针 struct SunLL A = {1,2,3};    //定义一个SunLL类型的变量A

结构体指针之 段错误 具体解释(segmentation fault)

一个网友问了我一个问题.一个C程序执行出现了段错误,这个问题非常好.非常多刚開始学习的人都easy犯这个错误,详细代码例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 这个编译没有问题,可是执行是段错误    Segmentation fault 由于你定义了一个结构体指针p.用来指向此类

用PostMessage或SendMessage发送结构体指针

SendMessage可以随意发送结构体指针. PostMessage则必须注意结构体的生命周期. 例如如下发送代码,使用PostMessage: struct _tag_aa { CString s1; char szBuffer[512]; int a; char* szText; }; _tag_aa *a=new _tag_aa; a->s1="ssssss11111111111111"; strcpy(a->szBuffer,"Bufferrrrrrrr

c语言中的结构体指针类型的cast

1.我们在c语言中会经常碰到强制类型转换. 在这,我介绍一种结构pointer类型转换,但是有前提(有点类似于c++中的继承中的子父对象的cast). 简单的介绍一下: 首先我们要知道一个结构的指针,并且 在这个结构体中,第一个结构成员必须也是一个结构体(最好是结构体类型). 那么我们可以这个结构体指针转换为指向这个结构体中第一个成员结构体的指针. 直接看代码: ************************************ /* struct transform for struct

go struct结构体

struct结构体 用来自定义复杂数据结构 struct里面可以包含多个字段(属性) struct类型可以定义方法,注意和函数的区分 struct类型是值类型 struct类型可以嵌套 Go语言没有class类型,只有struct类型 1.struct 声明 type 标识符 struct { field1 type field2 type } 样例: type Student struct { Name string Age int Score int } 2.struct 中字段访问:和其他

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

CMakeLists.txt # project(工程名) project(xxx) # add_library(链接库名称 SHARED 链接库代码) add_library(xxx SHARED xxx.cpp) xxx.cpp #include <iostream> using namespace std; // c++ 结构体定义 struct struck_ { // 股票名,字符串 char * stock_code_; // 开盘价 double stock_open_; };

C语言--- 高级指针2(结构体指针,数组作为函数参数)

一.结构体指针 1. 什么是结构体指针?指向结构体变量的指针     结构体:     typedef  struct stu{                          char name[20];                          char sex;                          int age;                    }Student;     Student stu1 = {"zhangsan",'m',23};  

C9_结构体指针

.h // //  MyFunction.h //  C9_结构体指针 // //  Created by dllo on 15/7/10. //  Copyright (c) 2015年 zhozhicheng. All rights reserved. // #import <Foundation/Foundation.h> // 结构体 // 学生:姓名,年龄,性别,成绩 struct student{ char stuName[20]; int  stuAge; char stuSex