深入浅析C/C++语言结构体指针的使用注意事项

 更新时间:2021年12月20日 09:31:23   作者:度若飞  
这篇文章主要介绍了C/C++语言结构体指针的使用,大家都知道指针在32位系统占用4Byte,在64位系统占用8Byte,下面看下c语言代码例子

主要内容

  • 结构体的使用 - 定义,赋值,结构体指针
  • 结构体作为函数参数的使用
  • 指针的使用

代码内容重点

1.结构体的使用 - 定义,赋值,结构体指针

2.结构体作为函数参数的使用 - 最好使用结构体指针作为参数,而不是结构体

因为当传递的结构体作为参数,数据量较大时,会占用较大的时间与空间,效率很低

使用结构体指针作为函数参数,比用结构体本身作参数效率高很多,当只是读取而不希望修改结构体值时,可以添加const防止改变结构体成员值

(STAFF_T const *p)

3.指针的使用 - 指针的定义,初始化,申请内存空间(malloc),释放(free)

指针在32位系统占用4Byte,在64位系统占用8Byte

注意:

使用malloc申请空间的指针,当不使用后需要手动释放,避免占用内存,并最好重新赋值为NULL,例p = NULL;

malloc后记得判断是否成功

指针的定义和初始化

int* p;

int i;

p = &i;

或者初始化为NULL

int* p = NULL;

C语言代码例子

这C代码在VSCode和GDB online上成功运行调试

/******************************************************************************

Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
C#, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.

*******************************************************************************/

#include <stdio.h>
#include <malloc.h>
#include <string.h>

typedef struct Staff_t{
    char* name;
    char sex;
    short age;
    float salary;
    char* date;
} STAFF_T;

void print_msg(STAFF_T const *p); // 结构体指针作为函数参数的使用例子

int main()
{   
    int size;
    
    //STAFF_T sta; // 定义一个结构体
    //staff = &sta; // 另外一种结构体初始化
    STAFF_T* staff = NULL; // 定义一个结构体指针,并初始化为NULL;

    // 为结构体申请内存空间,需要强制类型转换(这里为结构体指针类型),注意malloc成功返回字节数,失败返回NULL
    staff = (STAFF_T*)malloc(sizeof(STAFF_T)); 
    // 判断是否成功申请空间,只有申请成功才能使用,这一步很重要,许多人都容易忘记
    if (staff == NULL)
    {
        printf("malloc(STAFF_T) ERROR\n");
        return -1;
    }

    // 这里几行调试用,打印出在32/64位系统中一些数据类型所占用的内存空间大小不同
    size = sizeof(STAFF_T);
    printf("STAFF_T size = %d\n",size);
    printf("SIZEOF:\n char*:%lu, char:%lu,short:%lu,float:%lu \n",sizeof(char*),sizeof(char),sizeof(short),sizeof(float));

    staff->name = (char*)malloc(20*sizeof(char));
    
    // 在C语言中,staff->name以下的两种赋值方式都可以
    staff->name = "duruofei";//strcpy(staff->name, "duruofei");
    staff->sex = 'M';
    staff->age = 29;
    staff->salary = 15000;
    staff->date = (char*)malloc(20*sizeof(char));
    strcpy(staff->date,"2021-12-09");//strcpy(staff->date, "2021-12-09");
    
    // 传递结构体指针
    print_msg(staff); // 参数为指针常量,因为这里只是读取staff的值,而不希望修改staff的内容

    // 最后释放指针,并赋值为NULL。因为指针free后指针所指向的内存地址可以被其他变量使用,但指针本身还是指向原来地址,还可以使用,防止野指针
    free(staff);
    staff = NULL;

    printf("Hello World\n");

    return 0;
}

/**
 * function: print_msg
 * input: STAFF_T const *
 * ouput: none
 * descreption: print massage
 */
void print_msg(STAFF_T const *p)
{
    // 参数为指针常量,因为这里只是读取p的值,而不希望修改p的内容
    if (p == NULL) 
    {
        printf("print_msg: p is NULL\n");
    }
    
    printf("Name:%s, Sex:%c, Age:%d, Salary:%0.2f, Date:%s\n",\
            p->name, p->sex, p->age, p->salary, p->date);
}

到此这篇关于C/C++语言结构体指针的使用的文章就介绍到这了,更多相关C++结构体内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于函数传参问题(指针传参,值传参,引用传参)

    关于函数传参问题(指针传参,值传参,引用传参)

    这篇文章主要介绍了关于函数传参问题(指针传参,值传参,引用传参),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • C++实现学生信息管理系统(完整版)

    C++实现学生信息管理系统(完整版)

    这篇文章主要为大家详细介绍了C++实现学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • bmp 缩放代码(BMP位图任意放大 和缩小)

    bmp 缩放代码(BMP位图任意放大 和缩小)

    这篇文章主要介绍了bmp 缩放代码(BMP位图任意放大 和缩小),需要的朋友可以参考下
    2016-04-04
  • C++私有继承(三)

    C++私有继承(三)

    这篇文章主要介绍了C++私有继承(三),前面的文章我们已经介绍过了C++私有继承(一)和(二),下面小编就继续基于之前的内容继续向大家介绍C++私有继承,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-02-02
  • 解析C++引用

    解析C++引用

    引用是C++引入的新语言特性,是C++常用的一个重要内容之一。在工作中发现,许多人使用它仅仅是想当然,在某些微妙的场合,很容易出错,究其原由,大多因为没有搞清本源。在本篇中将对引用进行详细讨论,希望对大家更好地理解和使用引用起到抛砖引玉的作用
    2021-06-06
  • 深入探讨:宏、内联函数与普通函数的区别

    深入探讨:宏、内联函数与普通函数的区别

    本篇文章是对宏、内联函数与普通函数的区别进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++中的变长参数深入理解

    C++中的变长参数深入理解

    变长参数的函数,即参数个数可变、参数类型不定的函数。设计一个参数个数可变、参数类型不定的函数是可能的,最常见的例子是printf函数、scanf函数和高级语言的Format函数。最近的一个项目中就遇到这么一个相关的问题,感兴趣的朋友们下面来一起看看吧。
    2016-10-10
  • c++结构体排序方式(1条件,多条件)

    c++结构体排序方式(1条件,多条件)

    这篇文章主要介绍了c++结构体排序方式(1条件,多条件),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C++实现迷宫算法实例解析

    C++实现迷宫算法实例解析

    这篇文章主要介绍了C++实现迷宫算法实例解析,是一个比较经典的C++算法,有一定的学习与借鉴价值,需要的朋友可以参考下
    2014-07-07
  • 详解PID控制器原理

    详解PID控制器原理

    什么是 PID?它是一种在编程中使用的基本方法,如果正确调整,可以令人难以置信的有效和准确,PID代表比例积分微分,3个单独的部分连接在一起,虽然有时你不需要三个都使用。例如,您可以改为有P控制,PI控制或PD控制
    2021-06-06

最新评论