编程基础---C/C++基础知识

  1. 语法和语义

变量定义

基本数据类型:定义整型(int、long、short)、浮点型(float、double)、字符型(char)等基本数据类型的变量。

自定义类型:定义结构体、联合体、枚举等自定义类型变量。

指针类型:定义指向特定类型数据的指针变量,如int *p表示一个整型指针。

数据类型

基本数据类型:整型、浮点型、字符型、布尔型(C++中为bool,C中可使用整型模拟)。

复合数据类型:数组、结构体、联合体、枚举。

指针类型:指向任何数据类型的指针,包括指向函数的指针。

空类型void:用于表示无返回值的函数、无类型指针(如通用指针void *)。

运算符

算术运算符:加法(+)、减法(-)、乘法(*)、除法(/)、求余(%)。

关系运算符:等于(==)、不等于(!=)、小于(<)、大于(>)、小于等于(<=)、大于等于(>=)。

逻辑运算符:逻辑与(&&)、逻辑或(||)、逻辑非(!)。

位运算符:按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)、右移(>>)。

赋值运算符:简单赋值(=)及复合赋值运算符(如+=、-=、*=、/=、%=等)。

条件运算符(三目运算符):condition ? expr1 : expr2。

sizeof运算符:计算类型或变量所占内存大小。

取地址运算符:&,用于获取变量的内存地址。

解引用运算符:*,用于访问指针所指向的数据。

流程控制语句

条件语句:

if语句:根据条件执行相应代码块。
if…else语句:提供两种情况的选择性执行。
switch语句:根据表达式的值匹配多个case标签,执行相应的代码块。
循环语句:

for循环:具有初始化、条件检查、迭代更新三个部分的循环结构。
while循环:只要条件为真就持续执行循环体。
do…while循环:先执行一次循环体,然后在每次循环末尾检查条件。
跳转语句:

break语句:跳出当前循环或switch语句。
continue语句:跳过本次循环剩余部分,进入下一轮循环。
goto语句:无条件转移到同一函数内的标号处。

函数定义与调用

函数定义:指定函数返回类型、函数名、参数列表(含参数类型和顺序)及函数体。

函数声明:在函数调用前提供函数原型,以便编译器进行类型检查和链接。

函数调用:通过函数名、实参列表调用已定义或声明的函数。

参数传递:了解传值、传址(通过指针)、传引用(C++特有)的区别和适用场景。

返回值:函数可以返回一个值给调用者,也可以选择不返回值(void返回类型)。

2. 指针

指针声明

基础声明:声明一个指向特定类型数据的指针变量,如int *p;声明一个整型指针p。

指针初始化:为指针赋予一个合法的地址值,如int *p = &x;使p指向整型变量x。

指针运算

解引用:使用*运算符访问指针所指向的数据,如int val = *p;获取p指向的整数值。

自增自减:p++、p–使指针向前或向后移动到下一个(同类型)数据的地址。

指针间的关系运算:比较两个指针的地址关系,如p1 == p2、p1 < p2等。

动态内存管理

内存分配:

malloc(size_t size):分配size字节未初始化的内存,返回指向该内存的指针。
calloc(size_t num, size_t size):分配num个大小为size字节的连续内存块,并将其初始化为零,返回指向首块的指针。
内存重分配:

realloc(void *ptr, size_t new_size):调整已分配内存ptr的大小为new_size,返回新分配内存的指针。若调整失败,返回NULL,原内存保持不变。
内存释放:

free(void *ptr):释放由malloc、calloc或realloc分配的内存。
通过指针操作复杂数据结构
数组:使用指针遍历数组、修改数组元素、传递数组作为函数参数等。

结构体:通过指针访问结构体成员、传递结构体指针作为函数参数、动态分配结构体内存等。

联合体:类似结构体,但同一时刻只能存储一个成员,通过指针访问其当前活跃成员。

3. 结构体与联合体

结构体

定义:使用struct关键字定义结构体类型,包含若干成员(变量)及其类型。

struct Point {int x;int y;
};

变量声明:声明结构体类型变量,可使用类型名或typedef后的别名。

struct Point p1;            // 直接使用结构体类型名
typedef struct Point Point;  // 创建类型别名
Point p2;                   // 使用类型别名声明变量

成员访问:通过.或->运算符访问结构体变量的成员。

p1.x = 10;                  // . 运算符,用于普通结构体变量
Point *ptr = &p2;
ptr->y = 20;                // -> 运算符,用于指向结构体的指针

初始化:
常规初始化:在声明时为结构体变量的所有成员赋初值。

  struct Point p = {1, 2};

指定成员初始化:仅初始化部分成员,其余成员默认初始化。

  struct Point p = {.x = 1}; // 初始化x成员,y成员默认初始化

结构体数组:声明和使用结构体类型的数组。

struct Point points[3];
points[0] = {1, 2};
points[1] = {3, 4};
points[2] = {5, 6};

联合体

定义:使用union关键字定义联合体类型,其成员共享同一块内存空间。

union Value {int integer;float floating;char character;
};

变量声明:与结构体类似,声明联合体类型变量。

union Value v;

成员访问:与结构体类似,通过.或->运算符访问联合体变量的成员。

v.integer = 42;
v.floating = 3.14f;
v.character = 'A';

初始化:为联合体变量的某个成员赋初值。

union Value v = {.integer = 10};

注意:联合体在同一时刻只能存储一种类型的成员,对其中一个成员赋值会覆盖其他成员的值。使用联合体时需确保正确跟踪当前存储的是哪种类型的值。

4. 函数指针

定义:声明一个指向特定函数类型的指针变量,函数类型包括返回类型和参数列表

int (*func_ptr)(int, int); // 定义一个指向接受两个整数参数并返回整数的函数的指针

初始化:将函数指针指向实际的函数。

int add(int a, int b) {return a + b;
}func_ptr = add; // 将func_ptr指向add函数

调用:通过函数指针调用对应的函数。

int result = (*func_ptr)(5, 3); // 等价于调用add(5, 3)

应用场景:
回调函数:将函数指针作为参数传递给另一个函数,供后者在适当时候调用。
事件处理/中断服务:在嵌入式系统中,使用函数指针注册中断处理函数或其他事件响应函数。
函数表:创建一个函数指针数组,实现基于索引来调用不同功能的函数。
以上内容详述了C/C++语言中涉及的语法和语义、指针、结构体与联合体、函数指针等基础知识,特别关注了在嵌入式开发环境下的应用和注意事项。

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

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

相关文章

react组件:profiler

React Profiler 主要用于开发过程中的性能分析和优化&#xff0c;而不应在生产环境中使用&#xff0c;因为它可能会对性能产生一定的影响。 使用 包裹组件树&#xff0c;以测量其渲染性能。 ** id&#xff1a;字符串&#xff0c;用于标识正在测量的 UI 部分。 onRender&a…

Xshell Plus 详细安装教程以及附带使用图文教程

一、下载 Xshell Plus 6 完成后&#xff0c;请按照下面教程操作 1、下载 Xshell Plus 6 完成后&#xff0c;并解压 zip 包: 2、进入解压后的文件夹后&#xff0c;如果你之前安装了 Xshell&#xff0c; 先点击 !卸载.bat 卸载 xshell&#xff0c; 然后再点击 !绿化.bat; 如果是…

二分答案(砍树,借教室)

二分的两种情况附代码&#xff1a; 二分查找条件&#xff1a;单调&#xff0c;二段性 例题1&#xff1a;P1873 [COCI 2011/2012 #5] EKO / 砍树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 上代码&#xff1a; #include<bits/stdc.h> using namespace std; const …

校招说明书

3400字的详细说明&#xff0c;介绍了程序员类岗位校招的整体时间节点和招聘流程。还对一些常见的问题进行讨论&#xff0c;例如内推、offer和三方、实习等。 第一章介绍基本的术语&#xff0c;第二章介绍整个校招的重要流程及时间点&#xff0c;然后第三章介绍每次招聘要经过的…

什么是jQuery?怎么使用?

​ 文章目录 一、jQuery是什么二、dom对象和jQuery对象1、DOM对象可以和jQuery对象相互的转换 三、基本选择器1、元素选择器&#xff1a;根据HTML元素的名称选择元素2、ID选择器&#xff1a;通过元素的ID属性选择元素3、类选择器&#xff1a;通过元素的class属性选择元素4、通…

MySql 实战大数据查询-(表分区实现)

一 mysql分区&#xff1a; 分区是将单个表按照某种规则划分成多个子集&#xff0c;每个子集称为一个分区。常见的分区策略包括按照时间范围、范围值、列表等进行分区。 优点&#xff1a; 查询性能更好&#xff0c;涉及分区键的查询&#xff0c;数据库引擎可以只扫描特定分区&…

易宝OA ExecuteQueryForDataSetBinary SQL注入漏洞复现

0x01 产品简介 易宝OA系统是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台,具有信息管理、 流程管理 、知识管理(档案和业务管理)、协同办公等多种功能。 0x02 漏洞概述 易宝OA ExecuteQueryForDataSetBinary 接口处存在SQL注入漏洞,未经身份认证的攻击者…

Word中插入Endnote参考文献时显示乱码

近期在写文章需要插入参考文献&#xff0c;使用Endnote插入时显示乱码&#xff0c;如下图所示&#xff1a; 文章末尾显示{ADDIN EN REFILIST } 解决方法 在网上找了诸多方法尝试也没有解决&#xff0c;最终找到一篇博客介绍了一种方法&#xff1a; word选项—高级&#xff1…

openGauss学习笔记-256 openGauss性能调优-使用Plan Hint进行调优-优化器GUC参数的Hint

文章目录 openGauss学习笔记-256 openGauss性能调优-使用Plan Hint进行调优-优化器GUC参数的Hint256.1 功能描述256.2 语法格式256.3 参数说明 openGauss学习笔记-256 openGauss性能调优-使用Plan Hint进行调优-优化器GUC参数的Hint 256.1 功能描述 设置本次查询执行内生效的…

LAN和WAN, 调制解调器, 路由器,交换机 区别

LAN LAN&#xff08;Local Area Network&#xff09;是指在相对较小的地理范围内&#xff08;如办公室、学校、实验室、家庭等&#xff09;连接在一起的计算机和网络设备的集合。LAN通常由路由器、交换机、网线、无线路由器等设备组成&#xff0c;用于连接多台计算机、打印机、…

react状态管理库---zustand

一个简单的&#xff0c;快速的状态管理解决方案&#xff0c;api设计基于函数式和hooks 安装&#xff1a; npm install zustand 基础使用 让我们实现一个非常简单的计数器案例完成我们的第一个store 1- 创建一个counterStore create( ) 有三个参数&#xff1a;函数、布尔值…

Leetcode - 127双周赛

目录 一&#xff0c;3095. 或值至少 K 的最短子数组 I 二&#xff0c;3096. 得到更多分数的最少关卡数目 三&#xff0c;3097. 或值至少为 K 的最短子数组 II 四&#xff0c;3098. 求出所有子序列的能量和 一&#xff0c;3095. 或值至少 K 的最短子数组 I 本题需要知道一个知…

认识c++链表

上次发了《C链表&#xff08;上&#xff09;》&#xff0c;今天我再发一个认识c链表 C中的链表是一种常见的数据结构&#xff0c;用于存储和组织数据。链表由一系列节点组成&#xff0c;每个节点包含一个值和一个指向下一个节点的指针。链表的优点是可以在运行时动态地增加或删…

先进电气技术 —— (控制理论)何为稳定性?

一、系统稳定性 在控制理论中&#xff0c;系统稳定性是一个非常关键的概念&#xff0c;它主要涉及系统对外界扰动或内部变动的响应行为。以下是与系统稳定性相关的一些核心名词及其解释&#xff1a; 基本概念 稳定性&#xff08;Stability&#xff09; 系统稳定性是指当系统受…

Midjourney艺术家分享|By Moebius

Moebius&#xff0c;本名让吉拉德&#xff08;Jean Giraud&#xff09;&#xff0c;是一位极具影响力的法国漫画家和插画师&#xff0c;以其独特的科幻和幻想风格而闻名于世。他的艺术作品不仅在漫画领域内受到高度评价&#xff0c;也为电影、时尚和广告等多个领域提供了灵感。…

鸿蒙OS开发实例:【应用状态变量共享】

平时在开发的过程中&#xff0c;我们会在应用中共享数据&#xff0c;在不同的页面间共享信息。虽然常用的共享信息&#xff0c;也可以通过不同页面中组件间信息共享的方式&#xff0c;但有时使用应用级别的状态管理会让开发工作变得简单。 根据不同的使用场景&#xff0c;ArkT…

Redis 主从复制,哨兵模式,集群

目录 主从复制 主从复制 作用 缺陷 主从复制流程 实现Redis主从复制 哨兵模式 主从复制切换的缺点 哨兵的核心功能 哨兵模式原理 哨兵模式的作用 哨兵结构组成 故障转移机制 主节点的选举 实现哨兵模式 集群(Cluster) redis群集有三种模式&#xff0c;主从复制…

电脑硬件 -CPU

决定性能&#xff1a;CPU&#xff0c;内存&#xff0c;显卡&#xff0c;硬盘 保证性能&#xff1a;主板&#xff0c;电源&#xff0c;CPU散热器 英特尔&#xff1a;赛扬&#xff0c;奔腾&#xff0c;酷睿&#xff0c;至强&#xff08;从低到高&#xff09; 赛扬和奔腾&#…

电荷泵如何实现升压原来

电荷泵如何实现升压原来 某芯片自举栅极驱动内部原理图迪克森电荷泵 某芯片自举栅极驱动内部原理图 迪克森电荷泵 迪克森电荷泵&#xff08;Dickson Charge Pump&#xff09;是一种电压倍增器电路&#xff0c;可以将低电压升高到较高电压&#xff0c;相对于其他电压升压电路&a…

00-JAVA基础-反射机制

反射 什么是反射 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是Java语言的一个特性&#xff0c;它允许程序在运行时检查类、接口、字段和方法的信息。通过反射&#xff0c;Java代码能够动态地创建对象、调用方法、改变字段的值等&#xff0c;而无需在编译时…