首页 > 编程语言 >【自用10.2】C++结构体-指向结构体的指针&使用结构体传递值

【自用10.2】C++结构体-指向结构体的指针&使用结构体传递值

时间:2024-08-13 18:55:09浏览次数:19  
标签:salary 10.2 struct int C++ name xiaoniu girl 结构

指向结构体的指针

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

struct _friend{
    char name[32];
    char sex; // m - 男 f - 女
    int age;
};

int main(void){
    struct _friend girl = {"小珑", 'f', 18};
    struct _friend *my_girl = &girl;//定义指向结构体的指针
    printf("女生的名字:%s, 性别:%s 年龄:%d\n", girl.name,girl.sex=='m'?"男":"女", girl.age);
    
    //指针访问结构体变量的成员,有两种方式
    //方式 1. 直接解引
    printf("女生的名字:%s, 性别:%s 年龄:%d\n", (*my_girl).name,(*my_girl).sex=='m'?"男":"女", (*my_girl).age);
    //方式 2. 直接使用指针访问 ->
    printf("女生的名字:%s, 性别:%s 年龄:%d\n", my_girl->name,my_girl->sex=='m'?"男":"女", my_girl->age);
    
    system("pause");
    return 0;
}

实际开发中,常用第二种方式来访问结构体指针变量的成员

使用结构体传递值 

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

struct programer{
    char name[32];
    int age;
    int salary;
};

//形参是结构体变量,值传递
struct programer add_salary(struct programer p, int num){
    p.salary += num;
    return p;
}

//形参使用结构体指针
void add_salary1(struct programer *p, int num){
    if(!p) return ;
    p->salary += num;
}

//形参使用引用
void add_salary2(struct programer &p, int num){
    p.salary += num;
}

//形参是结构体变量,值传递,返回引用
struct programer& add_salary3(struct programer p, int num){
    p.salary += num;
    return p;
}

int main(void){
    struct programer xiaoniu;
    strcpy(xiaoniu.name, "小牛");
    xiaoniu.age = 28;
    xiaoniu.salary = 20000;

    //结构体变量做为参数传值是值传递,和 int 等基本类型一样
    xiaoniu = add_salary(xiaoniu, 5000);
    printf("姓名: %s, 年龄: %d, 薪水: %d\n", xiaoniu.name, xiaoniu.age,xiaoniu.salary);
    //指针传值
    add_salary1(&xiaoniu, 5000);
    printf("姓名: %s, 年龄: %d, 薪水: %d\n", xiaoniu.name, xiaoniu.age,xiaoniu.salary);
    //引用传值
    add_salary2(xiaoniu, 10000);
    printf("姓名: %s, 年龄: %d, 薪水: %d\n", xiaoniu.name, xiaoniu.age,xiaoniu.salary);
    //返回引用
    xiaoniu = add_salary3(xiaoniu, 20000);
    printf("姓名: %s, 年龄: %d, 薪水: %d\n", xiaoniu.name, xiaoniu.age,xiaoniu.salary);
    
    system("pause");
    return 0;
}

运行结果如下

返回引用的方法可以成功运行出结果,但是有一个警告,需要注意一下,尽量使用其他方法。

注意: 一般不建议把结构体直接作为函数参数。 因为结构体的 size 比较大,直接传递,消耗性能! 解决方案 : (使用指针和引用,优先使用引用)

 

标签:salary,10.2,struct,int,C++,name,xiaoniu,girl,结构
From: https://blog.csdn.net/m0_57667919/article/details/141170313

相关文章

  • 【自用11.】C++枚举
    概念当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型。比如,你可以用一个枚举类型的变量来表示季节,因为季节只有4种可能的取值:春天、夏天、秋天、冬天。 枚举类型的定义enum枚举名{枚举元素1,枚举元素2,……};//例如e......
  • 第18 章探讨 C++新标准 移动构造函数解析,强制移动
    第18章探讨C++新标准移动构造函数解析,强制移动第18章探讨C++新标准移动构造函数解析,强制移动文章目录第18章探讨C++新标准移动构造函数解析,强制移动18.2.5强制移动程序清单18.3stdmove.cpp18.2.5强制移动移动构造函数和移动赋值运算符使用右值。如果......
  • [OI] 可持久化数据结构
    学了一年OI才看懂这句话:\(\logn\)是以什么为底的?其实没什么区别因为我们自动忽略常数,因此\(\log_{a}n=\frac{\log_{x}n}{\log_{x}a}=\log_{x}n\)可持久化数组可持久化数组是基于可持久化线段树的一种数据结构.它可以支持如下操作:单点修改查询历史版本在历史版......
  • 菜单结构
    {"msg":"操作成功","code":200,"data":[{"path":"/","hidden":false,"redirect":"project",&q......
  • C/C++指针无关联,因为它指向已销毁的实例
    一、概述在使用Qt+OpenCV做项目的过程中,发现一个问题。指针无关联,因为它指向已销毁的实例产生这个问题的代码如下:constchar*GLSquareWindow::readFileToString(QStringresPath){QFilevertexShaderFile(resPath);if(!vertexShaderFile.open(QIODev......
  • 详解C++的四大特性(封装,继承,多态,抽象)
    C++的四大特性是面向对象编程(OOP)的核心概念,分别是封装、继承、多态和抽象。这些特性共同构成了C++作为面向对象编程语言的基础。1.封装(Encapsulation)概念:封装是将数据和操作数据的方法绑定在一起,限制对数据的直接访问。通过将数据隐藏在类内部,只暴露必要的接口(如public成......
  • 25版王道数据结构课后习题详细分析 第五章 树与二叉树 5.1 树的基本概念
     一、单项选择题————————————————————————————————————————解析:树是一种分层结构,它特别适合组织那些具有分支层次关系的数据。正确答案:D————————————————————————————————————————解......
  • C++面试
    1.讲一讲封装、继承、多态是什么?封装:将具体实现过程和数据封装成一个类,只能通过接口进行访问,降低耦合性,使类成为一个具有内部数据的自我隐藏能力、功能独立的软件模块。意义:保护或防止代码在无意之中被破坏,保护类中的成员,不让类中以外的程序直接访问或者修改,只能通过提供的公共接......
  • C++静态函数
    由于本人C++小白,关于C++的很多基础概念都不太理解,在工作当中遇到了静态函数,在函数的使用和调用外部函数与普通函数还是非常不一样的,故这里向AI请教,简单做个记录。AI的回答内容如下:Yousaid:C++当中静态函数的优势是什么ChatGPTsaid:在C++中,静态函数(static函数)是指通过在函......
  • 【C++ STL分配器】详细介绍
    C++中的分配器(Allocator)是用于抽象和管理内存分配与释放的机制,主要用于标准模板库(STL)容器。分配器的设计允许开发者自定义内存管理策略,从而优化性能、满足特殊需求或实现特定功能(如内存池、共享内存等)。本文将详细介绍C++分配器的概念、作用、自定义分配器的实现以及......