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

    先看一段代码:

    #include <stdio.h>   
    #include <stdlib.h>   
    #include <string.h>   
      
    struct student{   
      char *name;   
      int score;   
      struct student* next;   
    }stu,*stu1;    
      
    int main(){    
      stu.name = (char*)malloc(sizeof(char)); /*1.结构体成员指针需要初始化*/  
      strcpy(stu.name,"Jimy");   
      stu.score = 99;   
      
      stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/  
      stu1->name = (char*)malloc(sizeof(char));/*3.结构体指针的成员指针同样需要初始化*/  
      stu.next  = stu1;   
      strcpy(stu1->name,"Lucy");   
      stu1->score = 98;   
      stu1->next = NULL;   
      printf("name %s, score %d /n ",stu.name, stu.score);   
      printf("name %s, score %d /n ",stu1->name, stu1->score);   
      free(stu1);   
      return 0;   
    }  

    写测试代码的过程中我明白了,同事所说的二叉树遍历算法中所用的左子树和右子树指针不需要初始化,其实是这样的,左子树和右子树指向的必须是二叉树节点类型的结构体指针(你填一个长度相同的指针也可以),而该结构体指针是需要初始化的(见注释2),也就是并没有通过malloc来分配内存,而是将另一个指针的值赋给它 

    顿时觉得挺无语的,确实,看了很多大学里的教材,对于二叉树的遍历等算法定义的结构体无非是以下形式

    struct node{   
      int data;   
      struct node* lchild, rchild;   
    };  

    使用时都直接的

    struct node* root;   
    root = (struct node*)malloc(sizeof(struct node));   
    root->data = 3;   
      
    struct node* nlchild;   
    nlchild = (struct node*)malloc(sizeof(struct node));   
    root->lchild = nlchild;   
    nlchild->data = 2;    
      
    struct node* nrchild;   
    nlrchild = (struct node*)malloc(sizeof(struct node));   
    root->rchild = nrchild;   
    nrchild->data = 4;   

    这样子给人造成一种错觉好像结构体成员指针是不用初始化的。 
    可是,只要是指针,要使用它前就必须保证指针变量的值是一个有效的值;否则,它指向的内存一定是垃圾数据! C语言指针一般在什么时候需要申请内存空间
    C语言的内存管理很重要,集魄力和麻烦于一身,看你自己的心态如何了。如果你积极的面对,你正在控制一切;如果你觉得烦躁,你正不得不控制一切。C仍旧是博大精深的语言,信C哥! 

    附加:

    stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/

    这一句可能会有人把sizeof里边也填成struct student* ,可以理解这样的行为,因为stu本来就是struct student*,可是这样子你就没有为结构体分配足够的内存,使用中会因为内存错误同样报错的。 

    当然,仅仅为结构体指针分配内存还不够,结构体成员指针仍然需要分配内存,如下

    stu1->name = (char*)malloc(sizeof(char));  
    

     

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

    千次阅读 2020-04-07 17:57:34
    最近在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的数据访问、修改。

    展开全文
  • C语言结构体(5) 结构体指针变量

    千次阅读 2020-03-30 16:13:17
    那么,结构体类型是用户自己定义的数据类型,同样也可以定义指针变量结构体类型定义指针变量格式如下: struct 结构体类型名* 指针变量名; 定义指针变量的格式与基本数据类型定义指针变量格式一样。例如前面...

           C语言提供了基础数据类型,例如char、int等数据类型,可以定义指针变量。那么,结构体类型是用户自己定义的数据类型,同样也可以定义指针变量。结构体类型定义指针变量格式如下:

    struct 结构体类型名指针变量名;

           定义指针变量的格式与基本数据类型定义指针变量格式一样。例如前面定义的读者结构体类型struct reader,可以定义指针变量如下:

    struct reader* pr;

           此时pr变量是一个指针变量,指向struct reader类型的变量。指针可以存放一个变量的地址,所以,pr变量可以存放一个struct reader类型变量的地址。例如:

    struct reader r1; //定义结构体类型变量r1;

    struct reader* pr = &r1; //定义指针变量pr存放r1变量的地址,就是指向r1变量

           学习了指针的知识之后,我们可以使用指针降级运算符“*”对指针变量进行操作,把指针转换为指针所指向的对象。例如:

    struct reader r2 = *pr;

           此时,由于pr指向变量r1,那么,使用指针运算符“*”对其进行降级之后,转换为pr指针变量所指向的r1变量。那么,等价于:

    struct reader r2 = r1;

           就是把r1变量的数据赋给r2变量。在学习“访问结构体的成员”章节中,我们介绍了结构体变量访问其成员的方式,有如下两种方式:

    (1) 结构体变量名.成员名

    (2) 结构体指针变量名->成员名

           那么,如果指针变量是一级指针,使用指针降级运算符“*”对指针进行降级,转换为指针所指向的结构体变量,那么,就可以以结构体变量的形式访问成员,例如:(*指针变量).成员名。

           程序测试例子如下:

           程序运行结果如下:

           可以看到,我们定义了指针变量pr,并设置它指向变量r1。然后,可以通过指针降级运算符“*”对指针变量pr进行操作,访问它所指向的变量。同时,可以使用指针操作符“->”直接通过指针变量访问其所指向变量的成员。

           所以,结构体类型指针变量访问其成员的方式,可以总结如下:

    (1) 结构体变量.成员名;

    (2) 结构体指针变量->成员名;

    (3) (*结构体指针变量).成员名;

           注意,对于第三种方式,就是通过指针降级运算符“*”对指针变量进行降级,转换为指针变量所指向的变量。如果指针变量是一级指针,降级之后,转换为结构体变量,所以,可以以结构体变量的方式访问成员。

           如果是二级指针变量,需要2个指针降级运算符“*”进行降级,转换为结构体变量才可以。程序测试例子如下:

           程序运行结果如下:

           可以看到,对于指针变量的操作,可以是使用指针降级运算符“*”对指针变量进行降级操作。降级指针,转换为指针变量所指向的变量。

    更多的交流可以访问:www.mylinux.vip   加QQ:1523520001,微信:13926572996,备注:linux编程;
    学习、分享更多的linux C/C++ 编程知识。
     

    展开全文
  • C 语言学习笔记结构体 02结构体指针变量结构体变量 的函数参数 C 语言学习笔记之 结构体指针变量一提指针 那可 是 C 语言的核心了有多少学子曾拜倒在指针的脚下单纯的说指针其实并不难但是与其它的结构搭配在一起...
  • 可是,只要是指针,要使用它前就必须保证指针变量的值是一个有效的值;否则,它指向的内存一定是垃圾数据!  C语言的内存管理很重要,集魄力和麻烦于一身,看你自己的心态如何了。如果你积极的面对,你正在控制...
  • 此时定义一个结构体指针 stu *p; 一个结构体变量 stu q; 结构体指针p是指向一个结构体的,这个结构体没有名字,它指向的是一个结构体空间的首地址;如果需要使用这个结构体就必须malloc一个空间出来或者将一个
  • 最近在STM的GPIO结构体定义中看到源代码的时候,顺便复习下结构体指针变量的定义及typedef 的使用。 1.结构体类型定义 定义方式1: Typedef struct LNode { int data; // 数据域 struct LNode *next; // 指针域 } *...
  • c++结构体的“普通变量”和“指针变量”的区别: 普通变量: #include <stdlib.h> #include <iostream> using namespace std; typedef struct { int m; }Student, *Child; void Creat(Student &...
  • C结构体指针变量

    2020-02-09 15:53:51
    结构体指针变量 指针变量指向一个结构体变量,那么就叫做结构体指针变量。下面是其基本用法: struct stu{ ...... }; struct stu stud; //定义结构体变量 struct stu *pstud=&stud; //指针变量指向结构体变量 ...
  • 解题思路:在主函数中声明了struct student类型,然后定义了一个struct student类型的变量s_1,又定义了一个指针变量p,它指向一个struct student类型的对象,将结构体变量s_1的起始地址赋给指针变量p,也就是使p...
  • C语言结构体变量 指针以及对结构体成员的访问

    千次阅读 多人点赞 2019-10-12 12:21:26
    文章目录结构体结构体变量访问成员的方法结构体指针变量访问成员的方法 结构体 struct AGE { int year; int month; int day; }; struct STUDENT { char name[20]; //姓名 int num; //学号 struct AGE birthday...
  • 目录 概念 内存分配 对象的引用 结构体变量和结构体指针作形参的区别 含结构体变量和结构体指针变量形参的函数调用 ...结构体指针变量是指指向结构体变量的指针或者指向结构体数组的指针。 Studen
  • 之前在学习链表的过程中,笔者认为新... 看了老师的例程,发现老师定义结构体数据类型之后,在main()函数中没有定义结构体变量,而是使用结构体指针定义链表的新节点。 随后笔者做了如下测试: #include ...
  • C++ ->(结构体指针变量)

    千次阅读 2019-03-27 19:56:34
    一个指针变量当用来指向一个结构变量时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。...这里注意的是结构体指针变量需要先赋值之后才可以去使用。 如果key是先被声明是结构体类型的...
  • 结构体定义与使用 结构体是一种构造数据类型 把不同类型的数据组合成一个整体 结构体定义形式: struct 结构体名{ 结构体所包含的变量或数组 }; 结构体是一种集合,它里面包含了多个变量或数组,它们的...
  • 我的理解: 1,如果定义一个结构体指针变量,就一定要为这个结构体指针变量赋值一个有效的地址,否则因为结构体指针变量地址不明确,那之后得到的结构体成员值也不明确。 2,定义结构体变量而不是指针不会出现问题...
  • 结构体指针变量主讲人张静例如有如下定义struct student stu*s=&stu;则以下语句均是合法的strcpy(s->num,11201*s.age=20;stu.sex=M;注意*s)两侧的括号不可少因为成员符.的优先级高于*如去掉括号写作*s.num则等效于(s...
  • C语言中运用结构体指针输出结构体中的变量 #include<stdio.h> struct Data{ int year; int mounth; int day; }data; int main(){ Data data={2020,11,7}; struct Data *ptr; ptr=&data; printf("%...
  • 指向结构体指针&结构体成员指针

    万次阅读 2018-08-17 18:44:11
    指向一个结构体指针变量,其值是结构体变量的起始地址。 /* *copyright(c) 2018,HH *All rights reserved. *作 者:HH *完成日期:2018年8月17日 *版本号:v1.0 * *问题描述:指向结构体变量的指针的应用 *输入...
  • 结构体变量结构体指针的区别: 变量的内存存放在栈空间; 指针需要指向一块可用的空间,才可以使用这个指针; ​ #include <...定义一个Person的结构体变量per1,存放在栈空间 //2.内存随着...
  • 定义结构体 文件1 <GlobalVar1.h> /******************************* * file: GlobalVar1.h * author: hehl * time: 2019/11/5 *******************************/ #ifndef __GLOBALVAR1_H__ #define __...
  • 怎样通过指向结构体变量指针访问结构体变量中成员。 #include <stdio.h> #include <string.h> struct Student{ long int num; char name[15]; char sex; float score; }; int main()...
  • 使用python向C语言的链接库传递数组、结构体指针类型的数据 由于最近的项目频繁使用python调用同事的C语言代码,在调用过程中踩了很多坑,一点一点写出来供大家参考,我们仍然是使用ctypes来调用C语言的代码库。 ...
  • 一、首先我们来了解关于结构体以及结构体数组的概念。 自定义结构体: struct weapon{ char name[20]; int atk; int price; }; 它是"weapon"型(类似于我们熟知的int型,String型等),里面有一个...
  • C++指向结构体变量指针

    千次阅读 2017-04-05 19:42:33
    以上只是指定了一种结构体类型,它相当于一个模型,但其中并无具体数据,系统也不为之分配实际的内存单元为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。 定义结构体...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 135,695
精华内容 54,278
关键字:

结构体定义指针变量