C/C++语言结构体指针的使用

主要内容

  1. 结构体的使用 - 定义,赋值,结构体指针
  2. 结构体作为函数参数的使用
  3. 指针的使用

代码内容重点

  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++语言结构体指针的使用的更多相关文章

  1. C语言结构体指针(指向结构体的指针)详解

    C语言结构体指针详解 一.前言 一个指向结构体的变量的指针表示的是这个结构体变量占内存中的起始位置,同样它也可以指向结构体变量数组. *a).b 等价于 a->b. "."一 ...

  2. c语言结构体指针初始化

    今天来讨论一下C中的内存管理. 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左 ...

  3. C语言结构体指针初始化(转)

    reference: https://www.cnblogs.com/losesea/archive/2012/11/15/2772526.html 今天来讨论一下C中的内存管理. 记得上周在饭桌上和 ...

  4. c语言结构体指针必须初始化

    先说结论 结构体指针需要初始化 结构体指针的成员指针同样需要初始化 结构体变量定义的时候就已经分配了内存空间,而上面两个确没有 struct test{ int i; struct buf *p;} ...

  5. [编程] C语言结构体指针作为函数参数

    结构体指针作为函数参数:结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针.如果结构体成员较多,尤其是成员为数组时,传送的时间和空间 ...

  6. 结构体指针,C语言结构体指针详解

    结构体指针,可细分为指向结构体变量的指针和指向结构体数组的指针. 指向结构体变量的指针 前面我们通过“结构体变量名.成员名”的方式引用结构体变量中的成员,除了这种方法之外还可以使用指针. 前面讲过,& ...

  7. C语言结构体指针

    #include <stdio.h> int main() { /*************************************************** *结构体指针:指向 ...

  8. C语言结构体指针与结构体变量作形参的区别

    区别 结构体变量 结构体变量作为形参,传递的是结构体变量本身,是一种值传递 形参结构体变量成员值的改变不影响对应的实参构体变量成员值的改变 结构体指针 结构体指针作为函数参数,传递的是指向结构体变量的 ...

  9. C语言结构体指针的引用问题

    在写栈的一个应用时遇见这样的一个问题 SqStack s; s->base = (int*)malloc(sizeof(int)*10); 通过这样一个代码引用的时候,会导致程序出现异常 经过一 ...

随机推荐

  1. 在dotnet6发布之际,FastNat内网穿透,给开发人员送的硬货福利

    一.FastNat可为您解决的问题 1.没有公网服务器,但是想发布共享本地的站点或网络程序到公网上,以供他人访问: 此项功能大大方面开发人员进行远程调试,微信小程序等开发工作进行. 2.需要远程到在其 ...

  2. Java学习(十九)

    先学了字体分类 大概是这种效果: 一般把这些大类放在font-family的最后使用,防止字体呈现的效果不够好. 今天把final关键字学完了 也要几点要注意,我觉得比较重要的就是public sta ...

  3. Databend 社区积极拥抱 Rust 生态(202111回顾)

    Databend 旨在成为一个 开源.弹性.可靠 的无服务器数仓,查询快如闪电,与 弹性.简单.低成本 的云服务有机结合.数据云的构建,从未如此简单! Databend 对 Rust 社区的意义 Da ...

  4. pyhon-高并发测试

    使用gevent.对注册.接口进行200的并发量进行测试. #!/usr/bin/env python # -*- coding:utf-8 -*- #设置路径:Defualt Settings--- ...

  5. Excel 读取写入数据库

    // Excel 读取写入数据库 // 3.8版本的poi  4.0 可以不用写  parseCell  这个方法,可以直接赋值 STRING 类型 import org.apache.poi.hss ...

  6. [luogu7831]Travelling Merchant

    考虑不断找到以下两种类型的边,并维护答案: 1.终点出度为0的边,那么此时即令$ans_{x}=\min(ans_{x},\max(r,ans_{y}-p))$​ 2.(在没有"终点出度为0 ...

  7. [loj3342]制作菜品

    当$n-1\le m$,不妨令$d_{1}\le d_{2}\le...\le d_{n}$,则$(n-1)k\le mk=\sum_{i=1}^{n}d_{i}\le d_{1}+(n-1)d_{n ...

  8. 多线程03.实现Runnable接口

    package chapter2; public class TicketWindowRun implements Runnable { private static final int MAX =5 ...

  9. Java编程之学习技巧

    **本人博客网站 **IT小神 www.itxiaoshen.com 找到技术点 首先得知道自己要学习技术是什么?不管是来自同事.技术大牛推荐还是通过搜索引擎得到,或者另有出处如.技术交流群.技术论坛 ...

  10. shiro 学习笔记

    1. 权限管理 1.1 什么是权限管理? 权限管理实现对用户访问系统的控制,按照安全规则或者安全策略,可以控制用户只能访问自己被授权的资源 权限管理包括用户身份认证和授权两部分,简称认证授权 1.2 ...