精华内容
下载资源
问答
  • 本文介绍了使用指针操作结构体时应该注意的问题。
  • 结构体指针变量主讲人张静例如有如下定义struct student stu*s=&stu;则以下语句均是合法的strcpy(s->num,11201*s.age=20;stu.sex=M;注意*s)两侧的括号不可少因为成员符.的优先级高于*如去掉括号写作*s.num则等效于(s...
  • 结构体指针变量与结构体形参的关系一、结构体指针变量的声明二、结构体指针做形参三、如何通过形参更改主函数里的结构体变量的数据 一、结构体指针变量的声明 声明结构体时,我们首先需要声明一个结构体,然后用...

    一、结构体指针变量的声明

    声明结构体时,我们首先需要声明一个结构体,然后用typedef对结构体进行修饰,这样才可以创建相关结构体的变量类型。具体做法看一下代码:

    #include <stdio.h>
    
    typedef struct STU{
    	int age;
    	char *name;
    }STU;
    
    int main() {
    /*
    声明结构体STU类型的变量。说明一下,给赋值为NULL是一个良好的习惯。
    */
    	STU *stu = NULL;
    	
    	return 0;
    }
    

    二、结构体指针做形参

    在学会如何声明结构体变量指针之后,接下来我们看一下函数中传递结构体类型的指针形参变量:

    #include <stdio.h>
    
    typedef struct STU{
    	int age;
    	char *name;
    }STU;
    
    void initStu(STU **stu);
    
    void initStu(STU **stu) {
    /*
    这个条件判断只是为了检测指针的合法性,避免出现内存泄漏。
    如果不能理解可以跳过这个条件判断。
    */
    	if (NULL == stu || *stu != null) {
    		return NULL;
    	}
    	*stu = (STU*) calloc(sizeof(STU), 1);
    	(*stu)->age = 12;
    	(*stu)->name = "张三";
    }
    int main() {
    	STU *stu = NULL;
    	initStu(&stu);//结构体指针类型的实参
    	return 0;
    }
    

    上面就完成了结构体类型的实参传递。

    三、如何通过形参更改主函数里的结构体变量的数据

    看完上面的代码,不知道有没有人有这种想法:*stu可以看成声明了一个只有一个变量空间大小的数组STU stu[1],stu他已经是一个地址了,为什么还要传递&stu才可以改变结构体里面变量的值呢? 小编在学习到这一块的时候脑海中就浮现了这个疑问。下面,小编就谈谈为什么为什么要用**stu类型的形参

    首先,我得解释一下,将结构体变量名称作为结构体的首地址只是在个别编译器中有这样的功能。大部分编译器不支持该做法。所以我们介绍的主要是不支持该做法的编译器。

    第一种理解
    initStu(),这个函数的功能就是对变量stu进行初始化的。初始化之前stu的值为NULL,而初始化之后应该将其原本的值改了(具体改成多少,由calloc()函数决定)。我们都知道,在函数体里面想要改变主函数变量的值,必须将该变量的地址传入进去,所以我们现在为了在函数体里面将stu的值改变,就必须传入&stu。而stu本身就是一个一维指针,所以取地址后的值就变成了二维指针变量类型。因此用STU **stu

    第二种理解
    stu是该数组的首地址,这一点问题都没有。但是,在学习结构体数组的时候,相信大家都知道stu[0]就代表一个结构体变量,既然他是一个变量,而我们在函数体里面需要改变主函数里面变量的值时,往往传递进去的是变量的地址,所以我们在进行传递的时候就是需要将&stu[0]传递进去,这样才可以改变结构体里面变量的值。而stu[0]就等价于*stu。所以我们需要将形参变量声明成为**stu

    以上就是我个人的理解。如果哪里推理的有问题,欢迎大家指出。

    展开全文
  • 最近在STM的GPIO结构体定义中看到源代码的时候,顺便复习下结构体指针变量的定义及typedef 的使用。 1.结构体类型定义 定义方式1: Typedef struct LNode { int data; // 数据域 struct LNode *next; // 指针域 } *...

    最近在STM的GPIO结构体定义中看到源代码的时候,顺便复习下结构体指针变量的定义及typedef 的使用。
    1.结构体类型定义
    定义方式1:

    Typedef struct LNode {
    int data; // 数据域
    struct LNode *next; // 指针域
    } *LinkList;
    定义方式2:

    struct LNode {
    int data; // 数据域
    struct LNode *next; // 指针域

    };
    Typedef struct LNode *LinkList;
    以上两个定义方式是等价的,是将 *LinkList 定 义为 struct LNode 类型,即 LinkList 被定义为一个类型名。这样就可以用 LinkList来定义说明新的变量了,如:

    LinkList L;

    结构体变量与结构体指针变量的使用方法
    一、结构体的定义格式一般如下:

    Typedef struct SCI

    {

    U8 data[MAXLEN];
    
     U16 pos;
    

    }TSCI;

    二、访问结构体成员的基本方法有两种:

    1、定义一个结构体变量直接访问成员变量;

    2、定义一个结构体指针变量间接访问结构体变量。

    (1) 结构体变量访问

    TSCI Sci1;

    Sci1.data [ Sci1.pos++]= num;

    (2) 结构体指针变量访问

    TSCI *Sci2,b;

    Sci2= &b; //指针变量必须初始化 指向一个结构体变量

    Sci2->data[Sci2->pos++] = num;

    (3)(*Sci1).data Sci2->data 效果等效

    三、如何实现结构体被其他函数调用

    假设A文件中定义了一个结构体,B文件可以对A中定义的结构体进行访问和修改数据。

    1、 在A.h中定义结构体

    Typedef struct SCI

    {

    U8 data[MAXLEN];

    U16 pos;

    }TSCI;

    2、在A.c文件中声明一个结构体变量

    TSCI Sci;

    3、要实现B.c文件能够调用A中的结构体,需要做到两点:

    (1)在B.h中包含A.h头文件;

    (2)A.c中实现返回结构体变量地址的函数。

     实现函数如下:
    

    TSCI * Get_Address(void) //返回结构体变量的地址 (此TSCI结构体须在A.h中定义)

    {

    Return &Sci;
    

    }

    (4)在B.c中定义一个结构体指针变量,通过调用Get_Address函数得到Sci的地址,将此地址赋给B.h中定义的结构体指针变量。

     TSCI *pSci2;
    
     pSci2 = Get_Address();
    
     pSci2->data[pSci2->pos++]=num;
    
    
    
     这样就可以实现对A.c中的结构体变量Sci的数据访问、修改。
    
    展开全文
  • 由于经常要在函数中对结构体对象进行操作,所以函数形参中常常都是传值一个结构体指针变量,自己有时为了偷懒,干脆在定义对象时直接定义结构体指针变量,这样实参就不用取地址了。 这样想是没有错,但是结构体指针...
    1. 由于经常要在函数中对结构体对象进行操作,所以函数形参中常常都是传值一个结构体指针变量,自己有时为了偷懒,干脆在定义对象时直接定义结构体指针变量,这样实参就不用取地址了。
    2. 这样想是没有错,但是结构体指针变量的本质还是一个指针,只要是指针,使用它前就必须要对其初始化,否则它指向的内存一定是垃圾数据,而对其初始化只能是用其他结构体对象取地址或者是malloc申请堆空间,甚至不能用NULL为其初始化(指针会访问不到成员)。
    3. 结构体变量定义的就直接是结构体,而结构体指针变量定义的是指针,必须把它和结构体联系起来才能当作结构体用,方式就是用malloc申请空间或者赋值其他对象地址,让其指向结构体。
    4. 上述问题实际上就是c++中“两种创建对象方式的区别(类名创建和new创建)”的问题,二者是完全等价的,定义指针变量的同时申请堆空间,一定要把二者划等号!!!
    5. 注意如果是给结构体指针变量malloc来初始化,则一定要让“声明该变量”和“为其malloc堆空间”在同一作用域内,比如不可先在main中声明然后传值进函数后在函数中malloc,这样malloc的是该指针变量的副本,指针变量本身并没有指向结构体,仍是野指针;可以将声明和malloc都放在函数中然后再传值出来,也可以在main中声明传引用进函数malloc,或者malloc后传值进函数。(如果是通过赋值已有结构体地址的方式初始化指针变量,则也要让声明和赋值在一起。即:一般来讲,指针传入另一个函数后,只能对指针指向的空间进行操作,而不能修改指针的值,且指针的值在传入前就要设置好)
    6. 在定义结构体变量或者malloc结构体指针变量后,只是相当于将变量和结构体联系起来了而已,并没有为结构体初始化。初始化可以分别对各成员初始化也可以直接用其他对象为其赋值(结构体指针如果是赋值已有结构体地址就不用malloc了),结构体若没初始化完全常常会带来一些问题。
    展开全文
  • 结构体指针变量

    2017-06-29 10:06:11
    例9-3 应用结构体指针变量,打印结构体成员变量的信息。 #include struct Point { double x; double y; double z; }; int main() { struct Point oPoint1={100,100,0}; struct Point oPoint2; struct Point *...
    例9-3 应用结构体指针变量,打印结构体成员变量的信息。
    #include <stdio.h>
    struct Point
    {
    double x;
    double y;
    double z;
    };
    int main()
    {
    struct Point oPoint1={100 ,100,0};
    struct Point oPoint2;
    struct Point *pPoint;
    pPoint=& oPoint2;   
    (*pPoint).x= oPoint1.x;
    (*pPoint).y= oPoint1.y;
    (*pPoint).z= oPoint1.z;
    printf("oPoint2={%7.2f ,%7.2f,%7.2f}",oPoint2.x, oPoint2.y, oPoint2.z);
    return(0);
    }
    程序运行结果如下:
    oPoint2={ 100.00 ,100.00,0.00}
    其中表达式&oPoint2的作用是获得结构体变量oPoint2的地址。表达式pPoint=&oPoint2的作用是将oPoint2的地址存储在结构体指针变量pPoint中,因此pPoint存储了oPoint2的地址。*pPoint代表指针变量pPoint中的内容,因此*pPoint 和oPoint2等价。
    通过结构体指针变量获得其结构体变量的成员变量的一般形式如下:
    (* 结构体指针变量). 成员变量
    其中“结构体指针变量”为结构体指针变量,“成员变量”为结构体成员变量名称,“.”为取结构体成员变量的运算符。
    另外C语言中引入了新的运算符“->”,通过结构体指针变量直接获得结构体变量的成员变量,一般形式如下:
    结构体指针变量-> 成员变量
    其中“结构体指针变量”为结构体指针变量,“成员变量”为结构体成员变量名称,“- >”为运算符。
    因此,例9-3中的部分代码
    ……
    (*pPoint).x= oPoint1.x;
    (*pPoint).y= oPoint1.y;
    (*pPoint).z= oPoint1.z;
    ……
    等价于
    ……
    pPoint->x= oPoint1.x;
    pPoint->y= oPoint1.y;
    pPoint->z= oPoint1.z;
    ……
    下面介绍如何应用结构体指针变量存储结构体数组的首地址,以及如何通过结构体指针变量获得结构体数组的元素及其成员变量。
    例9-4 应用结构体指针变量改写例9-3,主要介绍修改部分Mutiline函数,其他部分略。
    void Mutiline(struct Point *pPoints)
    {
    int i;
    struct Point *pOPoint;
    pOPoint=pPoints;
    moveto(pPoints->x ,pPoints->y) ;
    for( i=0; i<NPOINTS ; ++i )
    {
    lineto(pPoints->x , pPoints->y);
    pPoints++;
    }
    pPoints=pOPoint;
    lineto(pPoints->x ,pPoints->y);
    }
    函数void Mutiline(struct Point *pPoints)的输入参数为struct Point指针变量pPoints。在主函数中调用形式为Mutiline(oPoints),将struct Point类型数组oPoints的首地址信息拷贝给形式参数struct Point *pPoint,此时pPoint指向结构体数组oPoints的第一个元素,如图所示。
    主函数调用Mutiline的过程如下,首先将struct Point类型数组oPoints的首地址信息拷贝给形式参数struct Point *pPoint,等价于
    pPoint= oPoints ;
    接下来,程序的控制权交给Mutiline函数,进入函数Mutiline。在程序进入函数Mutiline之后,pPoints 指向oPoints的首地址,跟踪程序表明此时变量pPoints的当前值为0X0F82。另外,由于数组第一个元素oPoints[0]的地址与数组的首地址相同。亦可以理解为此时pPoints指向了数组元素oPoints[0]的地址,因此*pPoints与oPoints[0]等价,表达式pPoints->x可以访问oPoints[0]的成员变量x,同样表达式pPoints->y可以访问oPoints[0]的成员变量y。执行pPoints++语句之后,pPoints的当前值为0X 0F9A。
    graphic

    0X0F9A- 0X0F82=0X0018=24=sizeof(struct Point) ,24个字节正好为struct Point的大小。
    此时pPoints指向数组元素oPoints[1]的地址, 因此*pPoints与oPoints[1]的等价。依次类推,通过pPoints的加法运算可以访问结构体数组oPoints中的所有元素。
    因此要正确理解结构体指针变量的算术运算,pPoints++或pPoints= pPoints+1的作用不是简单的地址值加1,而是当前的地址值加上结构体类型的大小。
    结构体指针变量+1= 结构体指针变量+sizeof(struct 结构体)
    例9-5 输入10个同学的姓名、数学成绩、英语成绩和物理成绩,确定总分最高的同学,并打印其姓名及其三门课程的成绩。
    #include "stdio.h"
    struct Student
    {
    char Name[20];
    float Math;
    float English;
    float Physical;
    };
    void main()
    {
    struct Student oStudents[10]={{"" ,0,0,0}};
    struct Student *pMaxStu;
    struct Student *pStudent;
    float fMaxScore ,fTotal;
    float fMath ,fEnglish,fPhysical;
    char szName[20];
    printf("\nPlease input 10 students and there score\n");
    printf("---------------------------- ------------\n");
    printf("Name Math English Physical \n");
    printf("---------------------------- ------------\n");
    fMaxScore=0;
    pMaxStu=oStudents;
    for(pStudent=oStudents;pStudent<oStudents+10;pStudent++)
    {
    scanf("%s %f %f %f" ,szName,&fMath,&fEnglish,&fPhysical);
    strcpy(pStudent->Name ,szName);
    pStudent->Math=fMath;
    pStudent->English=fEnglish;
    pStudent->Physical=fPhysical;
    fTotal=pStudent->Math+pStudent- >English+pStudent->Physical;
    if(fMaxScore<fTotal)
    {
    pMaxStu=pStudent;
    }
    }
    printf("---------------------------- ------------\n");
    printf("%s ,%f,%f,%f",
    pMaxStu->Name ,pMaxStu->Math,pMaxStu->English,pMaxStu- >Physical);
    }
    首先定义长度为10的struct Student类型结构体数组用于存储所有同学的相关信息,定义struct Student类型指针pMaxStu存储最高总分同学的地址信息。定义struct Student类型指针oStudents指向结构体数组oStudents 。
    循环语句
    for(pStudent=oStudents;pStudent<oStudents+10;pStudent++)
    中pStudent=oStudents的作用是令pStudent指向数组的第一个元素;循环条件是pStudent<oStudents+10,即循环10次。其中语句
    pStudent->Math=fMath;
    pStudent->English=fEnglish;
    pStudent->Physical=fPhysical;
    的作用是保存当前同学的相关信息。

    展开全文
  • 只要是指针,要使用它前就必须保证指针变量的值是一个有效的值 ;否则,它指向的内存一定是垃圾数据!  C语言指针一般在什么时候需要申请内存空间 C语言的内存管理很重要,集魄力和麻烦于一身,看你自己的心态如何...
  • 结构体指针变量的定义

    千次阅读 2020-04-07 17:57:34
    最近在STM的GPIO结构体定义中看到源代码的时候,顺便复习下结构体指针变量的定义及typedef 的使用。 1.结构体类型定义 定义方式1: Typedef struct LNode { int data; // 数据域 struct LNode *next; // 指针...
  • 我的理解: 1,如果定义一个结构体指针变量,就一定要为这个结构体指针变量赋值一个有效的地址,否则因为结构体指针变量地址不明确,那之后得到的结构体成员值也不明确。 2,定义结构体变量而不是指针不会出现问题...
  • C 语言学习笔记结构体 02结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之 结构体指针变量一提指针 那可 是 C 语言的核心了有多少学子曾拜倒在指针的脚下单纯的说指针其实并不难但是与其它的结构搭配在一起...
  • C结构体指针变量

    2020-02-09 15:53:51
    结构体指针变量 指针变量指向一个结构体变量,那么就叫做结构体指针变量。下面是其基本用法: struct stu{ ...... }; struct stu stud; //定义结构体变量 struct stu *pstud=&stud; //指针变量指向结构体变量 ...
  • C语言结构体(5) 结构体指针变量

    千次阅读 2020-03-30 16:13:17
    那么,结构体类型是用户自己定义的数据类型,同样也可以定义指针变量结构体类型定义指针变量格式如下: struct 结构体类型名* 指针变量名; 定义指针变量的格式与基本数据类型定义指针变量格式一样。例如前面...
  • //黑皮书的原文: 指针也是变量可以在程序中可以直接使用而不必通过间接引用的方法使用 // 例如,如果iq是另一个指向整型的指针,那么语句iq = ip; // 将把ip中的值拷贝到iq中,这样指针也指向ip指向的对象 #...
  • C++ ->(结构体指针变量)

    千次阅读 2019-03-27 19:56:34
    一个指针变量当用来指向一个结构变量时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。...这里注意的是结构体指针变量需要先赋值之后才可以去使用。 如果key是先被声明是结构体类型的...
  • #include <...struct Student //声明结构体类型Student { int num; char name[20]; char sex; int age; }; //下面将数据赋值 struct Student stu[5] = { {10101, "Zhou ping", 'M', 15}, //定
  • 可是,只要是指针,要使用它前就必须保证指针变量的值是一个有效的值;否则,它指向的内存一定是垃圾数据!  C语言的内存管理很重要,集魄力和麻烦于一身,看你自己的心态如何了。如果你积极的面对,你正在控制...
  • 一个结构体变量的指针就是该...声明一个结构体变量,无论是否初始化,都开辟内存,声明一个结构体指针变量,对其初始化的时候才会开辟内存。 A a[3]; a是A型的,有3个,当然分配A乘3大小的空间 A* a; a是A*型
  • 近期在学习数据结构的单链表问题时,涉及到了结构体定义,结构体使用以及定义结构体指针变量的问题不是很清楚,现在对关于结构体指针变量的使用做下记录 结构体指针变量的定义方式: struct 结构体类型名称 *...
  • /* 2015年8月28日13:20:28 通过函数完成对结构体变量的输入和输出*/# include &lt;stdio.h&gt;# include &lt;string.h&gt;struct Student{ int age; char sex; char name[100];}; //分号不能省void ...
  • https://blog.csdn.net/qq_42386328/article/details/81392074?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
  • #include<stdio.h> #include<string.h> struct AGE { int year; int month; int day; }; struct STU { char name[20]; int num; struct AGE birthday;...void InputStu(struct ST...
  • CC语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数C语言学习笔记之结构体指针变量一提指针,那可是C语言的核心了,有多少学子曾拜倒在指针的脚下。单纯的说指针,其实并不难,但是与其它的结构搭配在...
  • 结构体的使用:  今天去了坑爹的创新实验课,其实也不是说这个课很水,就是不适合大二的我在数电,模电都没接触的情况下去学习,所以我就对这个课就一头雾水,不过就在我蒙了几个小时后决定不能浪费我宝贵的时间,...
  • OC中的结构体变量和结构体指针变量的区别?,请写出相同点和不同点
  • 今天在写题目的时候出现了一处小错误,就是由于结构体指针和结构体变量没有区分清楚,接下来谈一谈这两者的区别; 2.内存空间上面的差别 假设有如下代码: typedef struct Stu { int age; }stu; 此时定义一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 180,562
精华内容 72,224
关键字:

结构体指针变量

友情链接: 车牌号识别3.zip