【C语言 全局 整形变量 布尔变量 数组变量 指针变量 结构体位域变量 枚举变量被其他.C文件相互访问】

news2024/11/24 12:52:47

【C语言 全局-> 整形变量 布尔变量 数组变量 指针变量 结构体位域变量 枚举变量被其他.C文件相互访问】

  • 【0】UI设计
  • 【1】项目概述
  • 【2】mainwindow.h头文件解析
  • 【3】头文件源码
  • 【4】mianwindow.c源文件解析
  • 【5】源文件源码
  • 【6】main文件解析+源码
  • 【7】编译-链接-运行结果

学完这一篇,对于变量的使用不在迷糊


【0】UI设计

UI使用文本编辑框显示操作的记录
在这里插入图片描述

【1】项目概述

本次使用QT平台进行编写和编译,使大家掌握某个.C文件的变量可以被其他文件 访问 | 修改 等

全局变量 整形 结构体 枚举 使用exterm关键字声名
目的:其他文件通过添加本文件头文件,可以使用这些变量 修改值|获取值|传参等

需要处理
【1】在本头文件.h必须使用exterm关键字声明变量
【2】在本源文件.C文件定义变量(分配变量空间)
【3】typedef关键字作用起别名


【2】mainwindow.h头文件解析

结构体声明

/* 全局变量 整形 结构体 枚举 使用exterm关键字声名
 * 目的:其他文件通过添加本文件头文件,可以使用这些变量 修改值|获取值|传参等*/
typedef  struct {
    int age;//可以被其他.c文件访问
}node_t;
extern node_t age_t;//可以被其他.c文件访问

常用数据类型变量声明

extern node_t age_t;//可以被其他.c文件访问
extern int global;  //可以被其他.c文件访问
extern bool global_bool;//可以被其他.c文件访问
extern int array[10];//可以被其他.c文件访问
extern char str[8];//可以被其他.c文件访问

exterm “C” 使用C的编译规范

extern "C"{//使用C语言的编译规范 因为C++11警告在其他.c文件给p赋值字符串
    extern char *p;//可以被其他.c文件访问
};

静态全局变量不能被其他.C文件访问

//extern static int a; //static关键字的一个作用就是限制变量的范围,即作用域 不能被其他.C文件访问

枚举声明

typedef enum{red,blue,green}color;//可以被其他.c文件访问

结构体位域声明
在嵌入式领域 几乎位域运算符的使用必不可少,这种处理的目的是为了给寄存器的某个位设置某个值,,或者对于一些标志位只有0和1的值,可以大大节省空间,其中位于的运算指标: 2 n 2^{n} 2n-1
举例:unsigned int bit:3; 那么 2 3 2^{3} 23-1=0-7 总共8个字符 也就是这个变量的最大值最多=7,最小值=0
注意:上面的变量用unsigned无符号修饰,所以取值范围:0-7 如果是有符号,请看下面说明。
位域变量的数据类型很重要
在这里插入图片描述
注意
在位域结构体中,常常使用结构体嵌套联合体,联合体在嵌套结构体,目的:联合体内的变量和联合体内的结构体共用一块内存保存数据,对联合体变量【uint32】赋值,就是对联合体内的结构体【bits】赋值,具体请看后面的代码实操
重点理解
【1】第一种赋值方式对uint32赋值,由于联合体内的变量共用一块内存,那么结构体内的uint16 | uint1 | 那个未使用占15个位的匿名变量将均分uint32的值

值分配的原则
【1】联合体内的结构体变量 从上到下 低字节-高字节
如uint32 = 0x0001ffff; 【十六进制 从左到右 高字节-低字节】
那么uint16=ffff 【占16个位 范围:0-65535】
uint1=1 【占1个位 范围:0-1】
匿名15位=0 【占15个位 范围:0- 2 15 2^{15} 215-1】
注意
联合体内的位域变量:16位+1位+15位=32位
和联合体内的uint32 = 32位相等
如此一来他们共用一块4字节的空间,赋值的时候不会出错。
【2】联合体内的位域变量赋值
先做初始化:
memset(&结构体栈地址,0x00,sizeof(结构体别名));目的:联合体内的所有变量=0
uint16=0xffff;
uint1=0x1;
此时想获取全部值,就uint32=0x0001FFFF
(高字节-低字节)
实例加深记忆
在这里插入图片描述
在这里插入图片描述

//位域结构体 常用于嵌入式寄存器设置位
typedef struct{
    union{//记住联合体共用一块内存 如同一笔钱  赋值的时候类比给钱
          //[1]家长可以给每个孩子钱 [2]每个孩子凑成的钱=家长的钱  孩子的个头不同 变量大小不同 分的钱也不同
        unsigned int uint32; //无符号整形范围 类比家长
        struct{ //结构体内部变量 类比孩子
                unsigned int uint16:16;//用于保存16位数据 范围:0-65535
                unsigned int uint1:1;  //用于保存1个位值  范围:0-1
                unsigned int :15;   //无用 只作为对齐填充,默认情况下值都是0
        }bits;
    }UNION;
}str_union;
extern str_union bitstruct;//可以被其他.c文件访问

【3】头文件源码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

/* 全局变量 整形 结构体 枚举 使用exterm关键字声名
 * 目的:其他文件通过添加本文件头文件,可以使用这些变量 修改值|获取值|传参等*/
typedef  struct {
    int age;//可以被其他.c文件访问
}node_t;
extern node_t age_t;//可以被其他.c文件访问
extern int global;  //可以被其他.c文件访问
extern bool global_bool;//可以被其他.c文件访问
extern int array[10];//可以被其他.c文件访问
extern char str[8];//可以被其他.c文件访问
extern "C"{//使用C语言的编译规范 因为C++11警告在其他.c文件给p赋值字符串
    extern char *p;//可以被其他.c文件访问
};

//extern static int a; //static关键字的一个作用就是限制变量的范围,即作用域 不能被其他.C文件访问

typedef enum{red,blue,green}color;//可以被其他.c文件访问

//位域结构体 常用于嵌入式寄存器设置位
typedef struct{
    union{//记住联合体共用一块内存 如同一笔钱  赋值的时候类比给钱
          //[1]家长可以给每个孩子钱 [2]每个孩子凑成的钱=家长的钱  孩子的个头不同 变量大小不同 分的钱也不同
        unsigned int uint32; //无符号整形范围 类比家长
        struct{ //结构体内部变量 类比孩子
                unsigned int uint16:16;//用于保存16位数据 范围:0-65535
                unsigned int uint1:1;  //用于保存1个位值  范围:0-1
                unsigned int :15;   //无用 只作为对齐填充,默认情况下值都是0
        }bits;
    }UNION;
}str_union;
extern str_union bitstruct;//可以被其他.c文件访问

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void setTextEdit();//显示所有值
    void setColor(color val);//接收枚举变量

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H


【4】mianwindow.c源文件解析

全局变量定义处,必不可少
在定义时可以赋值和不赋值,根据需求去写

/*全局变量定义处*/
node_t age_t;
int global;
int array[10]={0};
char str[8]="hello";//最多可存储8个字符
char *p="NULL";
bool global_bool=false;
str_union bitstruct;

变量初始化
对于结构体而言,一般使用这种方式初始化

memset(&bitstruct,0x00,sizeof (bitstruct));

使用两个函数来显示操作的记录

//设置显示文本
void MainWindow::setTextEdit()
{
    ui->textEdit->append(QString("年龄=%1").arg(age_t.age));
    ui->textEdit->append(tr("global=%1").arg(global));
    ui->textEdit->append(tr("global_bool=%1").arg(global_bool));
    ui->textEdit->append(tr("enum red=%1").arg(red));
    ui->textEdit->append(tr("array[0]=%1").arg(*array));//只获取第一个值
    ui->textEdit->append(tr("array[2]=%1").arg(array[2]));//只获取第3个值
    ui->textEdit->append(tr("str=%1").arg(str));
    ui->textEdit->append(tr("p=%1").arg(p));
    if(global_bool ==true)
    {
       qDebug("孩子uint16->hex=0x%x ",bitstruct.UNION.bits.uint16);
       qDebug("孩子uint1->hex=0x%x ",bitstruct.UNION.bits.uint1);
       qDebug("家长uint32->hex=0x%x \r\n",bitstruct.UNION.uint32);
    }
}

//接收一个枚举变量值
void MainWindow::setColor(color val)
{
    ui->textEdit->append(tr("enum green=%1").arg(val));
}


【5】源文件源码

#include "mainwindow.h"
#include "ui_mainwindow.h"
/*全局变量定义处*/
node_t age_t;
int global;
int array[10]={0};
char str[8]="hello";//最多可存储8个字符
char *p="NULL";
bool global_bool=false;
str_union bitstruct;

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    global=100;//全局变量初始化
    memset(&bitstruct,0x00,sizeof (bitstruct));
    ui->textEdit->append(QString("结构体所有值=%1").arg(bitstruct.UNION.uint32));
}

MainWindow::~MainWindow()
{
    delete ui;
}
//设置显示文本
void MainWindow::setTextEdit()
{
    ui->textEdit->append(QString("年龄=%1").arg(age_t.age));
    ui->textEdit->append(tr("global=%1").arg(global));
    ui->textEdit->append(tr("global_bool=%1").arg(global_bool));
    ui->textEdit->append(tr("enum red=%1").arg(red));
    ui->textEdit->append(tr("array[0]=%1").arg(*array));//只获取第一个值
    ui->textEdit->append(tr("array[2]=%1").arg(array[2]));//只获取第3个值
    ui->textEdit->append(tr("str=%1").arg(str));
    ui->textEdit->append(tr("p=%1").arg(p));
    if(global_bool ==true)
    {
       qDebug("孩子uint16->hex=0x%x ",bitstruct.UNION.bits.uint16);
       qDebug("孩子uint1->hex=0x%x ",bitstruct.UNION.bits.uint1);
       qDebug("家长uint32->hex=0x%x \r\n",bitstruct.UNION.uint32);
    }
}

//接收一个枚举变量值
void MainWindow::setColor(color val)
{
    ui->textEdit->append(tr("enum green=%1").arg(val));
}


【6】main文件解析+源码

从mainwindow.c 到main.c就是本次项目的重点,
我们需要在main.c获取mianwindow.c里面的变量,需要做两点:
【1】在main.c添加mianwindow.c的头文件
【2】在mianwindow.c/h文件中 声明 定义全局变量

以下代码在嵌入式或者其他领域都是通用性的,请大家仔细阅读,并理解通透

#include "mainwindow.h"
#include <QDebug>
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    age_t.age=100; //某个.c文件的全局结构体变量 在这里赋值
    qDebug()<<age_t.age;
    w.setTextEdit();
    global =120;    //某个.c文件的全局变量 在这里赋值
    w.setTextEdit();
    w.setColor(green);//某个.c文件的全局枚举变量 在这里赋值
    //mainwindow数组修改值
    array[0]=1;//赋值方式1
    array[1]=2;
    *(array+2)=3;//赋值方式2

    //修改字符串值
    str[0]='K';
    w.setTextEdit();

    //修改指针值
    p="ignore waring";

    global_bool=true;//某个.c文件的全局布尔变量 在这里赋值

    /*unsigned int 占4字节 有32位 在下面的举例中 uint16 占unsigned int[0-31]中的低16位 0-15 可看成unsigned short
      uint1 占unsigned int中的低17位 在16 其余不用的17-31保留复位值 */
    //给结构体-联合体-结构体位设置值 分散设置
    memset(&bitstruct,0x00,sizeof(bitstruct));//初始化的一种方式 复位全部为零
    w.setTextEdit();
    bitstruct.UNION.bits.uint16=0xffff;//2n次方 n=16 等65536 范围:0-65535 hex=0x0000 - 0xFFFF
    bitstruct.UNION.bits.uint1=1;      //2n次方 n=1  等2     范围:0-1 hex=0x0 - 0x1
    w.setTextEdit();
    //给结构体-联合体-结构体位设置值   一次性设置
    memset(&bitstruct,0x00,sizeof(bitstruct));
    bitstruct.UNION.uint32 |=(unsigned int)1<<16 ; //设置uint1 这个位=1 其他位保持不变  【嵌入式寄存器必用】
    w.setTextEdit();
    bitstruct.UNION.uint32 |=(unsigned int)1<<15 ; //设置uint16 最高位=1 其他位保持不变 【嵌入式寄存器必用】
    w.setTextEdit();
    bitstruct.UNION.uint32 =0x00018000;//将上面的两步一次性赋值
    w.setTextEdit();
    memset(&bitstruct,0x00,sizeof(bitstruct));
    bitstruct.UNION.uint32 =0x00018000;//将上面的两步一次性赋值
    bitstruct.UNION.uint32 &= ~((unsigned int)1<<16);//清空uint1这个位 其他位保持不变 【嵌入式寄存器必用】
    w.setTextEdit();
    //初始化的另一种方式 复位全部为零
    int arry=0x00;
    memcpy(&bitstruct,&arry,sizeof (arry));
    w.setTextEdit();

    w.show();
    return a.exec();
}


【7】编译-链接-运行结果

打印结果

结构体所有值=0
年龄=100
global=100
global_bool=0
enum red=0
array[0]=0
array[2]=0
str=hello
p=NULL
年龄=100
global=120
global_bool=0
enum red=0
array[0]=0
array[2]=0
str=hello
p=NULL
enum green=2
年龄=100
global=120
global_bool=0
enum red=0
array[0]=1
array[2]=3
str=Kello
p=NULL
年龄=100
global=120
global_bool=1
enum red=0
array[0]=1
array[2]=3
str=Kello
p=ignore waring
年龄=100
global=120
global_bool=1
enum red=0
array[0]=1
array[2]=3
str=Kello
p=ignore waring
年龄=100
global=120
global_bool=1
enum red=0
array[0]=1
array[2]=3
str=Kello
p=ignore waring
年龄=100
global=120
global_bool=1
enum red=0
array[0]=1
array[2]=3
str=Kello
p=ignore waring
年龄=100
global=120
global_bool=1
enum red=0
array[0]=1
array[2]=3
str=Kello
p=ignore waring
年龄=100
global=120
global_bool=1
enum red=0
array[0]=1
array[2]=3
str=Kello
p=ignore waring
年龄=100
global=120
global_bool=1
enum red=0
array[0]=1
array[2]=3
str=Kello
p=ignore waring

文本框一次显示不完,输出结果就是上面这段,可以对比源码观看,效果更佳
在这里插入图片描述

在这里插入图片描述


位域结构体实例运行结果

11:01:10: Starting C:\Users\sujieyin\Desktop\QT\build-TEST-Desktop_Qt_5_14_2_MinGW_64_bit-Debug\debug\TEST.exe ...
100
孩子uint16->hex=0x0 
孩子uint1->hex=0x0 
家长uint32->hex=0x0 

孩子uint16->hex=0xffff 
孩子uint1->hex=0x1 
家长uint32->hex=0x1ffff 

孩子uint16->hex=0x0 
孩子uint1->hex=0x1 
家长uint32->hex=0x10000 

孩子uint16->hex=0x8000 
孩子uint1->hex=0x1 
家长uint32->hex=0x18000 

孩子uint16->hex=0x8000 
孩子uint1->hex=0x1 
家长uint32->hex=0x18000 

孩子uint16->hex=0x8000 
孩子uint1->hex=0x0 
家长uint32->hex=0x8000 

孩子uint16->hex=0x0 
孩子uint1->hex=0x0 
家长uint32->hex=0x0 

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/126563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对Java中String类的解释

文章目录一、String 的常用方法1.字符串的构造以及字符串常量池2.String 类中对象的比较3.字符串查找4.转化5.字符串替换6.字符串拆分7.字符串截取二、StringBuilder 和 StringBuffer1.引入两者的原因2.相关修改操作的介绍一、String 的常用方法 首先&#xff0c;在介绍 Strin…

[年终总结] 2023,希望一切都能够好起来

0. 引言 2022年&#xff0c;依旧是一个特殊的年份&#xff0c;从前年开始&#xff0c;我就开始撰写年终总结&#xff0c;感兴趣的大家可以看一看2020年终总结和2021年年终总结。 一年比一年过的快速&#xff0c;我也感觉到一年比一年过的更加珍惜。曾经以为自己尚且年轻&…

linux /dev/mapper/rhel-root分区扩容

命令查看linux内存占用情况 /dev/mapper/rhel-root分区已满&#xff0c;主要是东西太多&#xff0c;改善了也删了&#xff0c;但是还是不够用。在扩容之前在首先针对虚拟机硬盘进行扩展 接下来就是在linux上操作了 1、输入fdisk -l 这里显示我已经有了三个分区&#xff0c;sd…

ArcGIS基础实验操作100例--实验9线要素的延伸与裁剪

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 基础编辑篇--实验9 线要素的延伸与裁剪 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;…

qinglong-青龙面板部署

背景 之前服务器部署过 jd自动签到、刷豆的脚本&#xff0c;感觉还可以&#xff0c;薅羊毛每天1-2米左右&#xff0c;能把服务器成本薅回来&#xff0c;不过缺点不好管理&#xff0c;后面很久没人维护就凉了。最近了解到青龙面板能够很方便的维护这种脚本。所以部署了一下。 …

SQL学习笔记-聚合函数部分

鉴于自己最近在做后端开发的工作时&#xff0c;发现自己的SQL能力实在太差&#xff0c;开始学习SQL语句基础&#xff0c;学习过程中在本博客进行笔记记录&#xff0c;课程参考&#xff1a;SQL课程 聚合函数是一系列SQL内置的方法&#xff0c;能够完成一些非常使用的功能&#…

java输入语句怎么写

壹哥在前面给大家讲过&#xff0c;Java中给咱们提供了有三个标准的“流”&#xff0c;他们被统称为standard streams。除了负责输出的流之外&#xff0c;还有一个负责输入的标准流&#xff0c;Java中对应的API是System.in。 与标准输出相比&#xff0c;标准输入则复杂的多。尤…

OpenHarmony#深入浅出学习eTs/ArkUI#(一)模拟器/真机环境搭建

本项目的Gitee仓地址&#xff1a;深入浅出eTs学习: 带大家深入浅出学习eTs (gitee.com) &#xff08;之前有些意外&#xff0c;数据丢失了&#xff0c;现在重新发&#xff0c;且不参与任何活动&#xff0c;在第一篇说明一下&#xff0c;之后就不再说明了&#xff09; 一、下载…

2022 年 11 种最佳移动自动化测试工具

移动应用程序开发正在以前所未有的速度增长&#xff0c;并且相应地需要使用正确的移动测试策略执行彻底的测试。这些策略主要涉及使用各种移动自动化测试工具。 移动测试工具可帮助企业自动化其应用程序测试&#xff0c;并减少额外的成本、时间和人为错误的机会。我们生活在一个…

用QT实现一个模型交互的网络请求

最近&#xff0c;我接收到了一个项目需求&#xff0c;具体内容如下&#xff1a; 具体要求&#xff1a; 1.交付给我程序的源代码即可&#xff0c;因为我要集成到我的大软件中&#xff0c;要求采用C和QT开发&#xff1b; 2.程序首先检测当前用户环境有没有联网&#xff0c;如果没…

linux的权限

前言 学习权限我们先理解一下xshell 我们使用Xshell的存在的意义 帮助进行命令行传递和返回结构保护操作系统 linux的权限 (1)权限的概念 限制人的&#xff0c;访问的对象可能没有这种“属性” 权限&#xff1a;一件事情是否运行被谁“做” 权限 人 事物属性 (2)linux的上…

【vector的各个begin迭代器详解】

前言 本文是熊猫练习stl一段时间之后&#xff0c;对vector容器的各种迭代器产生了很大的好奇心&#xff0c;于是对它们进行了以下探究。 从图中我们可以知道&#xff0c;vector一个有四组不同的迭代器&#xff0c; 其中&#xff0c;字符 ‘c’ 是 const 常量的意思&#xff0c…

严蔚敏 《数据结构C语言版》读书笔记

目录 第一章 线性表 顺序表 Sequence Table 带头双向循环链表 Linked List 第二章 栈和队列 栈 Stack &#xff08;顺序存储&#xff09; 检查括号是否匹配 队列 Queue &#xff08;链式存储&#xff09; 循环队列 Circle Queue 第三章 串 模拟实现string.h库函数 第…

2 面向对象编程

面向对象编程(OOP) **面向对象的程序(oop)**是由对象组成的&#xff0c; 每个对象包含对用户公开的特定功能部分和隐藏的实现部分。 传统的结构化程序设计通过**设计一系列的过程&#xff08;即算法&#xff09;**来求解问题。一旦确定了这些过程&#xff0c; 就要开始考虑存…

设备通过发放批量自注册场景体验【玩转华为云】

创建实例 首先&#xff0c;根据提示创建实例 实例名称实例描述 创建成功 可以看到&#xff0c;当前实例已经在运行中了 设备发放 在左侧列表中点击“设备发放” 功能简介 您可以通过“设备发放”轻松管理跨多区域&#xff0c;海量设备的发放工作&#xff0c;实现单点发放管…

.Net WebApi— SwaggerUI配置

最近新公司用了特别老的技术【Web 服务 .asmx文件 做WebService服务】&#xff0c;而WebApi早就流行四五年了&#xff1b; 实在太过于简陋&#xff0c;关键其他系统对接的同事&#xff0c;经常说对接不上&#xff0c;如果接口过多确实不方便接口管理&#xff0c;所以最终决定重…

基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备

文章目录一、前言二、系列文章三、解析&#xff1a;完整源码1. helloworld_amlogic_char_driver.c2. Makefile四、编译执行4.1 编译4.2 执行&#xff08;1&#xff09;部署&#xff08;2&#xff09;加载ko文件&#xff08;3&#xff09;查看结果&#xff08;4&#xff09;是否…

android 皮肤包换肤之Resources加载(一)

Android 换肤之资源(Resources)加载(一) 本系列计划3篇: Android 换肤之资源(Resources)加载(一) — 本篇setContentView() / LayoutInflater源码分析(二)换肤框架搭建(三) 看完本篇你可以学会什么? Resources在什么时候被解析并加载的 Application#ResourcesActivity#Reso…

【Python黑帽子】——搭建TCP端口扫描器

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门 创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座…

计算1到n的和(不用循环且逐步限制条件)

目录 一、题目简单描述 二、递归实现 1、if…else… 2、三目运算符 &#xff1f;&#xff1a; 3、逻辑与操作符 && 三、公式实现 四、C调用构造函数累加法 注&#xff1a;满足题目要求的解法有递归实现的第三种、公式实现、C调用构造函数累加法三种方法、 一、题目简…