精华内容
下载资源
问答
  • 指向结构体的指针&结构体成员指针

    万次阅读 2018-08-17 18:44:11
    1、指向结构体指针 一个 变量的指针,就是该变量所占据的内存段的起始地址。指向一个结构体指针变量,其值是结构体变量的起始地址。 /* *copyright(c) 2018,HH *All rights reserved. *作 者:HH *完成日期:...

    1、指向结构体的指针

    一个 变量的指针,就是该变量所占据的内存段的起始地址。指向一个结构体的指针变量,其值是结构体变量的起始地址。

    /*
    *copyright(c) 2018,HH
    *All rights reserved.
    *作 者:HH
    *完成日期:2018年8月17日
    *版本号:v1.0
    *
    *问题描述:指向结构体变量的指针的应用
    *输入描述:;
    *程序输出:
    */
    
    
    #include <stdio.h>
    #include <string.h>
    struct student
    {
        int num;
        char name[12];
        char sex;
        float score;
    };
    int main()
    {
        struct student stu;
        stu.num=1001;
        strcpy(stu.name,"Ma Yun");
        stu.sex='F';
        stu.score=66.6;
        struct student *p=&stu;//定义了指向该结构体变量的指针
        printf("%d %s %c %f\n",stu.num,stu.num,stu.sex,stu.score);
        printf("%d %s %c %f\n",(*p).num,(*p).name,(*p).sex,(*p).score);
        printf("%d %s %c %f\n",p->num,p->name,p->sex,p->score);
        return 0;
    }
    
    
    
    
    
    

    2、指向结构体指针的另一种形式

    例如:tRecordWave *pWave;//此种方法,就等价于*pWave=&tRecordWave

    typedef struct
    {
    	uChar	state;			//本条录波状态,RCD_STATE_IDLE等值
    	tRecordHead	head;		//头信息
    	uShort	nextSmpIndex;	//下一个要记录的采样点的序号
    	uShort	recordedNum;    //已记录的点数,当此值达到要求的录波点数时,录波完成
    
    	BIT32	waveDig[RCD_POINT_NUM];		//开入量和信号量录波数据
        short	waveAI[RCD_POINT_NUM][4+RCD_MAX_AI_NUM+2];//模拟量录波数据
    }tRecordWave;
    
    tRecordWave *pWave;//此种方法,就等价于*pWave=&tRecordWave

     

    展开全文
  • 先看一段代码: #include <stdio.h> #include <stdlib.h> ...当然,仅仅为结构体指针分配内存还不够,结构体成员指针仍然需要分配内存,如下 stu1->name = (char*)malloc(sizeof(char));  

    先看一段代码:

    #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));  
    

     

    展开全文
  • 结构体指针 与 结构体成员指针

    千次阅读 2018-12-23 11:39:05
    一、结构体指针: struct A //结构体类型名A ...二、结构体成员指针: struct B //定义结构体类型名B { int a; float *b; //定义结构体成员指针b struct B *next; //定义结构体成员指针next }m,n;...

    一、结构体指针:
    struct A //结构体类型名A
    {
    int a;
    float b;
    }m; //结构体变量名m
    A*p=&m //定义一个A类型的结构体指针指向m

    二、结构体成员指针:
    struct B //定义结构体类型名B
    {
    int a;
    float *b; //定义结构体成员指针b
    struct B *next; //定义结构体成员指针next
    }m,n; //定义结构体变量名m,n
    float c =2.2;
    m.b=&c; //成员b是指向float类型的指针
    m.next=&n; //成员next是指向struct B 类型的指针

    展开全文
  • container_of() 宏返回一个指向包含该结构体成员的结构体的指针。 如果您有一个只传递指向结构成员的指针的 API,这将非常有用。 您可以使用此宏来获取指向包含该指针的结构的指针。 member_pointer是指向...
  • C代码  ...当然,仅仅为结构体指针分配内存还不够,结构体成员指针仍然需要分配内存,如下 C代码  stu1->name = ( char *)malloc( sizeof ( char )); 
    C代码  复制代码
    1. #include <stdio.h>   
    2. #include <stdlib.h>   
    3. #include <string.h>   
    4.   
    5. struct student{   
    6.   char *name;   
    7.   int score;   
    8.   struct student* next;   
    9. }stu,*stu1;    
    10.   
    11. int main(){    
    12.   stu.name = (char*)malloc(sizeof(char)); /*1.结构体成员指针需要初始化*/  
    13.   strcpy(stu.name,"Jimy");   
    14.   stu.score = 99;   
    15.   
    16.   stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/  
    17.   stu1->name = (char*)malloc(sizeof(char));/*3.结构体指针的成员指针同样需要初始化*/  
    18.   stu.next  = stu1;   
    19.   strcpy(stu1->name,"Lucy");   
    20.   stu1->score = 98;   
    21.   stu1->next = NULL;   
    22.   printf("name %s, score %d /n ",stu.name, stu.score);   
    23.   printf("name %s, score %d /n ",stu1->name, stu1->score);   
    24.   free(stu1);   
    25.   return 0;   
    26. }  
    [c]  view plain  copy
    1. #include <stdio.h>  
    2. #include <stdlib.h>  
    3. #include <string.h>  
    4.   
    5. struct student{  
    6.   char *name;  
    7.   int score;  
    8.   struct student* next;  
    9. }stu,*stu1;   
    10.   
    11. int main(){   
    12.   stu.name = (char*)malloc(sizeof(char)); /*1.结构体成员指针需要初始化*/  
    13.   strcpy(stu.name,"Jimy");  
    14.   stu.score = 99;  
    15.   
    16.   stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/  
    17.   stu1->name = (char*)malloc(sizeof(char));/*3.结构体指针的成员指针同样需要初始化*/  
    18.   stu.next  = stu1;  
    19.   strcpy(stu1->name,"Lucy");  
    20.   stu1->score = 98;  
    21.   stu1->next = NULL;  
    22.   printf("name %s, score %d /n ",stu.name, stu.score);  
    23.   printf("name %s, score %d /n ",stu1->name, stu1->score);  
    24.   free(stu1);  
    25.   return 0;  
    26. }  



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

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

    C代码  复制代码
    1. struct node{   
    2.   int data;   
    3.   struct node* lchild, rchild;   
    4. };  
    [c]  view plain  copy
    1. struct node{  
    2.   int data;  
    3.   struct node* lchild, rchild;  
    4. };  


    使用时都直接的

    C代码  复制代码
    1. struct node* root;   
    2.  root = (struct node*)malloc(sizeof(struct node));   
    3.  root->data = 3;   
    4.   
    5.  struct node* nlchild;   
    6.  nlchild = (struct node*)malloc(sizeof(struct node));   
    7.  root->lchild = nlchild;   
    8.  nlchild->data = 2;    
    9.   
    10.  struct node* nrchild;   
    11.  nlrchild = (struct node*)malloc(sizeof(struct node));   
    12.  root->rchild = nrchild;   
    13.  nrchild->data = 4;   
    [c]  view plain  copy
    1. struct node* root;  
    2.  root = (struct node*)malloc(sizeof(struct node));  
    3.  root->data = 3;  
    4.   
    5.  struct node* nlchild;  
    6.  nlchild = (struct node*)malloc(sizeof(struct node));  
    7.  root->lchild = nlchild;  
    8.  nlchild->data = 2;   
    9.   
    10.  struct node* nrchild;  
    11.  nlrchild = (struct node*)malloc(sizeof(struct node));  
    12.  root->rchild = nrchild;  
    13.  nrchild->data = 4;   


    这样子给人造成一种错觉好像结构体成员指针是不用初始化的。 

    可是,只要是指针,要使用它前就必须保证指针变量的值是一个有效的值;否则,它指向的内存一定是垃圾数据! 
    C语言的内存管理很重要,集魄力和麻烦于一身,看你自己的心态如何了。如果你积极的面对,你正在控制一切;如果你觉得烦躁,你正不得不控制一切。C仍旧是博大精深的语言,信C哥! 

    /*附加:仍旧是指针*/

    C代码  复制代码
    1. stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/  
    [c]  view plain  copy
    1. stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/  


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

    C代码  复制代码
    1. stu1->name = (char*)malloc(sizeof(char)); 
    展开全文
  • 在添加sqlite3的加解密功能函数时,由于网上资料针对的版本是旧版sqlite3源码,现在新版上做修改遇到了一个宏,该宏是旧版上的,它作用是由结构体成员指针pData找到它所属的结构体指针。下面转的文章详解了这种机制...
  • c++根据结构体成员指针找到结构体指针

    千次阅读 多人点赞 2013-07-17 23:54:00
    使用宏CONTAINING_RECORD,可以直接根据结构体成员指针找到结构体指针。为什么这样就能得到结构体指针?这个得益于结构体在申请内存空间是一段连续的地址,我们可以通过其中某个成员变量的地址,减去该成员的偏移来...
  • struct student { char * name;  int age; }stu, *pstu; int main() { strcpy(stu.name, 'Zhangsan');  stu.age = 20;  return 0; } 问:这段代码有什么错误?...答:定义的结构体变量stu,分配了char *类
  • 问题:当一个结构体成员指针类型时,为这个结构体申请内存时,并不会给指针成员分配内存。 程序如下: #include <stdio.h> #include <stdlib.h> typedef struct example { int *a; char *b; }...
  • struct student{char * name; int score;}stu, *pstu;int main(){strcpy(stu.name, 'Jimy'); stu.score = 90;...答:定义的结构体变量stu,分配了char *类型的指针指针变量name本身只分配了4个字节)和int...
  • CUDA拷贝结构体成员指针

    千次阅读 2019-07-14 15:14:10
    在网上看了好多CUDA中在拷贝结构体以及在内核中如何访问结构体成员变量的帖子,都没找到一个质量好的,so, 自己写一个吧。。。 先来个结构体: struct Stu_Struct{ int count; //人数 short* score; //每...
  • 1、野指针举例 例1:明显的野指针,直接赋值 #include <stdio.h> int main() { int a; int *p; *p=10;//错误来源与此处 printf("%d %d\n",a,*p); return 0; } *p没有被初始化,而直接赋值为10,相当...
  • c语言定义结构体可以直接声明结构体变量的,如下 struct Student{ char *name; int age; }xiaoming 这样以来,我们就定义了一个结构体类型,同时声明了一个结构体变量xiaoming。那么。我们在main函数中怎样对...
  • 结构体指针成员初始化问题

    千次阅读 2020-02-03 11:09:45
    所有成员变量的值都是0 , char [10] 型 "\0", int 是 0, struct Node * 是NULL。 声明为全局量,会自动初始化为上述值。 typedef struct cacheEntryS { int key; /* 数据的key */ int value; /* 数据的data */....
  • 在C语言中有一个经典的宏定义,可以将结构体struct内部的某个成员指针转化为结构体自身的指针。下面是一个例子,通过FIELD_OFFSET宏计算结构体内一个字段的偏移,函数getT可以从一个F*的指针获得对应的T*对象。 ....
  • 结构体成员和结构体指针初始化

    千次阅读 2018-06-28 11:38:22
    结构体成员指针需要初始化*/ strcpy(stu.name,"Jimy"); stu.score = 99; stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/ stu1->name = (char*)malloc(sizeof(char...
  • 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...
  • package main import "fmt" //定义一个结构体类型 type Student struct { id int name string sex byte //字符类型 age int addr string } func main() { //1、指针有合法...
  • 通过结构体成员拿到结构体的指针,是C语言实现继承多态的基础。面向对象C编程可以参看这里OOC 面向对象C语言编程实践。这里详细介绍这个核心的操作方法。 /** * Get struct pointer from member pointer */ #...
  • 如何给结构体指针中的成员赋值?0#include #include using namespace std;typedef struct{int title_span;string title_name;}TypeTitleInfo;int main(){TypeTitleInfo *stTypeTitleInfo;stTypeTitleInfo = new ...
  • 结构体指针成员的动态分配

    千次阅读 2017-05-19 11:45:12
    结构体变量a的起始地址,也就是a结构体首个变量type的地址0x8b4d008,其中偏移4字节,跟前面示例1对比,看似并没什么问题,但是注意,示例1中a->type之后是一个数组变量,而在本例中,a->type之后是一个指针变量,...
  • 在 计算结构体中某个元素相对结构体首字节地址的偏移量 基础上进行结构体成员指针反推该结构体变量的指针 计算结构体中某个元素相对结构体首字节地址的偏移量:...
  • <code>typedef struct _player { Pack pack; }Player; typedef struct _pack { Wares wares[20]; }Pack; typedef struct _wares { int id; }Wares; void ShowId(Player *);... 感谢大佬</li></ol>
  • C语言--结构体成员指针

    千次阅读 2018-01-09 07:46:55
    结构体中有指针变量的时候,切记要将这个成员malloc,否则编译不会出错,但是运行的时候程序会跑飞了 原因:指针没有给它指定一个地方,这个指针就是个野指针,在对这个野指针操作后,代码运行的时候很容易出问题...
  • 指针访问结构体成员的问题

    千次阅读 2017-09-13 17:39:00
    今天给大一的小孩讲结构体,讲到指向结构体的指针的时候,突然一个小孩提出了一个问题:指向结构体成员指针p加1后指向谁?当时懵了,想写个程序验证一下,脑子一片空白。好像提问题的那个小孩听明白的,就干脆让他...
  • 结构体指针引用结构体成员

    千次阅读 2020-04-04 22:24:49
    设计一个结构体,存储某个学生的主要学籍信息,包括姓名,性别,班级和学号等,使用结构体实现对结构体变量成员的输入和输出 #include<stdio.h> struct si { char name[30]; char sex[10]; unsigned int ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 119,510
精华内容 47,804
关键字:

结构体成员指针

友情链接: Demo.zip