学习c++的第二天
目录
数据类型
基本数据类型
typedef 声明
枚举类型
类型转换
变量类型
变量定义
变量声明
左值(Lvalues)和右值(Rvalues)
变量作用域
数据类型
基本数据类型
C++ 为程序员提供了种类丰富的内置数据类型和用户自定义的数据类型。下表列出了七种基本的 C++ 数据类型:
类型 | 关键字 |
---|---|
布尔型 | bool |
字符型 | char |
整型 | int |
浮点型 | float |
双浮点型 | double |
无类型 | void |
宽字符型 | wchar_t |
类型修饰符:signed、unsigned、short、long
注:一些基本类型可以使用一个或多个类型修饰符进行修饰,比如:signed short int简写为short、signed long int 简写为long。
下表显示了各种变量类型在内存中存储值时需要占用的内存,以及该类型的变量所能存储的最大值和最小值。
注意:不同系统会有所差异,一字节为 8 位。默认情况下,int、short、long都是带符号的,即 signed。long int 8 个字节,int 都是 4 个字节,早期的 C 编译器定义了 long int 占用 4 个字节,int 占用 2 个字节,新版的 C/C++ 标准兼容了早期的这一设定。
类型 | 位 | 范围 |
---|---|---|
char | 1 个字节 | -128 到 127 或者 0 到 255 |
unsigned char | 1 个字节 | 0 到 255 |
signed char | 1 个字节 | -128 到 127 |
int | 4 个字节 | -2147483648 到 2147483647 |
unsigned int | 4 个字节 | 0 到 4294967295 |
signed int | 4 个字节 | -2147483648 到 2147483647 |
short int | 2 个字节 | -32768 到 32767 |
unsigned short int | 2 个字节 | 0 到 65,535 |
signed short int | 2 个字节 | -32768 到 32767 |
long int | 8 个字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
signed long int | 8 个字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
unsigned long int | 8 个字节 | 0 到 18,446,744,073,709,551,615 |
float | 4 个字节 | 精度型占4个字节(32位)内存空间,+/- 3.4e +/- 38 (~7 个数字) |
double | 8 个字节 | 双精度型占8 个字节(64位)内存空间,+/- 1.7e +/- 308 (~15 个数字) |
long double | 16 个字节 | 长双精度型 16 个字节(128位)内存空间,可提供18-19位有效数字。 |
wchar_t | 2 或 4 个字节 | 1 个宽字符 |
注意,各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主。
以下列出了32位系统与64位系统的存储大小的差别(windows 相同):
typedef 声明
typedef是C和C++语言中的一个关键字,用于给一个已有的数据类型起一个新的别名。typedef可以提高代码可读性和可维护性。
typedef的语法如下:
typedef existing_type new_type_name;
其中,existing_type代表要起别名的已有数据类型,new_type_name代表新的别名。existing_type可以是任意合法的数据类型,包括基本数据类型、指针、结构体、联合体、枚举等。
typedef可以将一个复杂的数据类型(例如struct或者union)简化为一个易于使用和理解的名称,也可以定义新的类型名称以使得多个数据类型具有相同的类型名称,从而增加代码的清晰度。
下面是一些typedef的例子:
typedef int myint; // 将 int 类型起个新的别名 myint
typedef float* pfloat; // 将 float* 类型起个新的别名为 pfloat// 用 typedef 定义结构体别名
typedef struct {char name[20];int age;
} Person;// 用 typedef 定义枚举类型别名
typedef enum {Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
} Weekday;
在上面的例子中,myint是int类型的别名,pfloat是float*类型的别名。Person是一个结构体别名,可以通过Person代替struct { char name[20]; int age; }来定义结构体。Weekday是一个枚举类型的别名,可以通过Weekday代替enum { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }来定义枚举类型。
需要注意的是,typedef只是给一个已有的数据类型起一个新的别名,它并不会创建新的数据类型。因此,typedef语句不能用于定义新的变量,而只能用于定义新的类型名称。
枚举类型
枚举类型是C和C++中的一种数据类型,用于定义一个有限的、命名的整数值集合。枚举类型可以简化代码的可读性和维护性,同时提供了一种方式来表示一组相关的常量。
在C/C++中,定义一个枚举类型使用enum关键字,其语法如下:
enum enum_name {value1,value2,value3,// ...
};
其中,enum_name是枚举类型的名称,value1、value2、value3等是枚举常量,表示枚举类型的取值。每个枚举常量都会被编译器分配一个整数值,默认情况下从0开始递增。
以下是一个示例:
enum Color {RED, // 0GREEN, // 1BLUE // 2
};enum Weekday {Monday, // 0Tuesday, // 1Wednesday, // 2Thursday, // 3Friday, // 4Saturday, // 5Sunday // 6
};
在上面的示例中,Color是一个枚举类型,它包含了三个枚举常量RED、GREEN和BLUE。默认情况下,RED的值是0,GREEN的值是1,BLUE的值是2。
同样地,Weekday是另一个枚举类型,它包含了七个枚举常量,分别代表星期一到星期日,它们的值从0到6递增。
在使用枚举类型时,可以通过枚举常量来表示具体的值。例如:
Color myColor = RED;
Weekday today = Wednesday;
上述代码中,myColor被赋值为RED,today被赋值为Wednesday。
需要注意的是,枚举常量的作用域是在所属的枚举类型中,并且枚举常量之间是唯一的。也可以通过显式地指定枚举常量的值来自定义枚举常量的整数值。例如:
enum Status {OK = 0,ERROR = -1,WARNING = 1
};
在这个示例中,Status是一个枚举类型,它包含了三个枚举常量OK、ERROR和WARNING,并且分别被赋予了整数值0、-1和1。
枚举类型在编程中经常用于表示一组相关的常量,增加代码的可读性和可维护性。它在switch语句中也常用于改善代码的可读性,使得程序更加清晰易懂。
类型转换
类型转换是将一个数据类型的值转换为另一种数据类型的值。
C++ 中有四种类型转换:静态转换、动态转换、常量转换和重新解释转换。
1、静态转换(Static Cast):
静态转换是一种编译时类型转换,在代码中使用 static_cast<type>(value) 的形式进行。它可以将基本数据类型或者用户定义的类型进行转换。静态转换通常用于比较宽松的类型转换,例如将一个指针转换为整数类型,或者将一个整数类型转换为枚举类型等。但需要注意的是,静态转换可能会导致数据精度损失或无效的转换,因此在进行类型转换时要谨慎使用,并确保转换操作是安全和合理的。
2、动态转换(Dynamic Cast):
动态转换是一种运行时类型转换,在代码中使用 dynamic_cast<type>(pointer) 的形式进行。它通常用于将一个基类指针或引用转换为派生类指针或引用。在进行动态转换时,需要注意转换操作的安全性,如果指针或引用不是指向实际对象,则转换操作会失败,返回空指针或引用。
3、常量转换(Const Cast):
常量转换是一种用于移除变量的常量属性或加上变量的常量属性的类型转换,使用 const_cast<type>(variable) 的形式进行。它通常用于解决一些编译器警告或者将 const 类型转换为非 const 类型的情况。但是需要注意,常量转换只能用于非常量变量上,否则会导致未定义的行为。
4、重新解释转换(Reinterpret Cast):
重新解释转换是一种类型转换,它可以将一个指针转换为另一个无关类型的指针,或者将一个整数类型转换为一个指针类型,使用 reinterpret_cast 进行。它通常用于将不同类型之间的二进制数据进行转换,但需要注意的是,这种转换可能会产生危险和未定义的行为,因此在使用时要格外小心。
下面是一个简单的代码示例,演示了在 C++ 中如何使用不同类型转换方式:
#include <iostream>
using namespace std;int main() {// 静态转换int a = 10;double b = static_cast<double>(a);cout << "Static Cast: " << b << endl;// 动态转换class Base {public:virtual void print() {cout << "This is a Base class." << endl;}};class Derived : public Base {public:void print() {cout << "This is a Derived class." << endl;}};Base* base_ptr = new Derived;Derived* derived_ptr = dynamic_cast<Derived*>(base_ptr);if (derived_ptr != NULL) {derived_ptr->print();} else {cout << "Dynamic Cast Failed." << endl;}// 常量转换const int x = 5;int y = const_cast<int&>(x);y++;cout << "Const Cast: " << y << endl;// 重新解释转换int c = 100;void* ptr = reinterpret_cast<void*>(&c);int* d = reinterpret_cast<int*>(ptr);cout << "Reinterpret Cast: " << *d << endl;return 0;
}
输出结果如下:
Static Cast: 10
This is a Derived class.
Const Cast: 6
Reinterpret Cast: 100
该示例中分别使用了四种不同的类型转换方式,包括静态转换、动态转换、常量转换和重新解释转换。静态转换将整数类型转换为浮点数类型,动态转换将基类指针转换为派生类指针并调用其成员函数,常量转换将 const 类型的变量转换为非 const 类型的变量并修改其值,重新解释转换将整数类型的变量地址转换为 void 类型的指针并再次转换回整数类型的指针。通过该示例,可以更加深入地理解不同类型转换方式的使用方法和注意事项。
变量类型
1、整数类型(Integer Types):
- int:用于表示整数,通常占用4个字节。
- short:用于表示短整数,通常占用2个字节。
- long:用于表示长整数,通常占用4个字节。
- long long:用于表示更长的整数,通常占用8个字节。
2、浮点类型(Floating-Point Types):
- float:用于表示单精度浮点数,通常占用4个字节。
- double:用于表示双精度浮点数,通常占用8个字节。
- long double:用于表示更高精度的浮点数,占用字节数可以根据实现而变化。
3、字符类型(Character Types):
- char:用于表示字符,通常占用1个字节。
- wchar_t:用于表示宽字符,通常占用2或4个字节。
- char16_t:用于表示16位Unicode字符,占用2个字节。
- char32_t:用于表示32位Unicode字符,占用4个字节。
4、布尔类型(Boolean Type):
- bool:用于表示布尔值,只能取true或false。
5、枚举类型(Enumeration Types):
- enum:用于定义一组命名的整数常量。
6、指针类型(Pointer Types):
- type*:用于表示指向类型为type的对象的指针。
7、数组类型(Array Types):
- type[]或type[size]:用于表示具有相同类型的元素组成的数组。
8、结构体类型(Structure Types):
- struct:用于定义包含多个不同类型成员的结构。
9、类类型(Class Types):
- class:用于定义具有属性和方法的自定义类型。
10、共用体类型(Union Types):
- union:用于定义一种特殊的数据类型,它可以在相同的内存位置存储不同的数据类型。
11、其他类型:
- 空类型(void):空类型表示无类型。
- nullptr类型(nullptr):nullptr类型表示空指针。
12、引用类型:
- 引用类型(int&,float&等)
注意:这些变量类型具有不同的特性和用途。基本数据类型用于存储单个数据值,复合数据类型可以存储多个相关数据值,指针类型和引用类型用于间接访问变量和内存地址,类类型用于创建自定义的对象类型,空类型表示无类型,nullptr类型表示空指针。
例如,以下是使用不同变量类型的示例:
#include <iostream>
using namespace std;int main() {int age = 25; // 整数类型double salary = 5000.75; // 浮点数类型char grade = 'A'; // 字符类型bool isPassed = true; // 布尔类型int numbers[] = {1, 2, 3, 4, 5}; // 数组类型struct Person {string name;int age;};Person person1 = {"John", 30}; // 结构体类型enum Color { RED, GREEN, BLUE }; // 枚举类型Color color = GREEN;int* ptr = nullptr; // 指针类型int& ref = age; // 引用类型class Circle {double radius;};Circle c; // 类类型void* p = nullptr; // 空类型return 0;
}
在这个示例中,我们用不同的变量类型声明和初始化了变量。请注意,C++是一种静态类型语言,变量必须在使用之前显式声明其类型,并且不能在运行时更改其类型。
变量定义
在C++中,可以使用以下语法来定义变量:
type variable_name; // 变量定义,不初始化
type variable_name = value; // 变量定义,并初始化为特定的值
其中,type表示变量的数据类型(type 必须是一个有效的 C++ 数据类型,可以是 char、wchar_t、int、float、double、bool 或任何用户自定义的对象),variable_name表示变量的名称(variable_list 可以由一个或多个标识符名称组成,多个标识符之间用逗号分隔。),value表示变量的初始值。
以下是一些示例:
int age; // 定义一个整数变量age
double salary = 5000.75; // 定义一个双精度浮点数变量salary并初始化为5000.75
char grade = 'A'; // 定义一个字符变量grade并初始化为'A'
bool isPassed = true; // 定义一个布尔变量isPassed并初始化为trueint x, y, z; // 同时定义多个整数变量x, y, z
double pi = 3.14159, radius = 5; // 同时定义多个双精度浮点数变量pi, radius并初始化
注意事项:
- 变量名必须遵循标识符的命名规则,且不能与C++的关键字重复。
- 在定义变量时,可以选择是否对其进行初始化。未初始化的变量将具有不确定的值。
- 可以在定义变量时使用赋值运算符 = 进行初始化,将特定的值赋给变量。
- 在同一行上可以定义多个相同类型的变量,并用逗号 , 分隔它们。
值得一提的是,C++还支持在函数内部定义局部变量、在类中定义成员变量以及在命名空间中定义全局变量。这些变量定义的语法稍有不同,但基本原则和概念相同。
变量声明
在C++中,变量的声明是指在使用变量之前提前声明其存在,告诉编译器变量的类型和名称。变量声明只会创建变量的标识符,而不会分配内存空间或初始化变量。
以下是一些变量声明的例子:
1、声明整数变量:
extern int age; // 声明一个整数变量age
2、声明浮点数变量:
extern double pi; // 声明一个双精度浮点数变量pi
3、声明字符变量:
extern char grade; // 声明一个字符变量grade
4、声明布尔变量:
extern bool isPassed; // 声明一个布尔变量isPassed
5、声明字符串变量:
#include <string> // 引入<string>头文件
using namespace std;extern string name; // 声明一个字符串变量name
需要注意的是,变量的声明通常与变量的定义分开。变量的定义是在声明的基础上为变量分配内存空间并可能进行初始化。变量的声明一般放在头文件中,以便在多个源文件中共享同一个变量。
例如,在一个名为 variables.h 的头文件中声明变量:
extern int age; // 声明整数变量age
extern double pi; // 声明双精度浮点数变量pi
extern char grade; // 声明字符变量grade
然后,在源文件中进行变量的定义和初始化:
#include "variables.h"int age = 25; // 定义并初始化整数变量age
double pi = 3.14159; // 定义并初始化双精度浮点数变量pi
char grade = 'A'; // 定义并初始化字符变量grade
这样,通过在源文件中包含声明的头文件,可以在不同的源文件中访问和使用这些变量。
左值(Lvalues)和右值(Rvalues)
在C++中,表达式可以分为左值(lvalues)和右值(rvalues)。左值和右值的主要区别在于它们在赋值操作符的左边或右边出现的位置。
左值(lvalue)是一个具有内存地址并且可以被引用的表达式。它可以出现在赋值操作符的左边或右边。换句话说,左值是一个可以被取址的表达式。典型的左值包括变量、对象成员以及通过解引用指针获得的值。
右值(rvalue)是一个临时的、不具有内存地址的表达式。它只能出现在赋值操作符的右边。右值通常是临时生成的值、字面量或表达式的结果。右值不能直接被引用,但可以通过将其绑定到右值引用(rvalue reference)来延长其生命周期。
C++11引入了右值引用(rvalue references),它们是一种新的引用类型,用于延长右值的生命周期并支持移动语义。通过将右值绑定到右值引用上,可以对其进行修改或移动。
下面是一些示例:
int x = 5; // x是一个左值
int& lvalueRef = x; // 左值引用可以引用左值int y = x + 3; // x+3是一个右值
int&& rvalueRef = x + 3; // 右值引用可以引用右值int z = std::move(x); // std::move()将左值转换为右值引用
需要注意的是,C++中的一些情况下,左值可以被隐式地转换为右值,例如在函数返回语句中,即使左值也可以用作右值。
总结来说,左值是具有内存地址的表达式,可以出现在赋值操作符的左边或右边。右值是临时生成的、不具有内存地址的表达式,只能出现在赋值操作符的右边。右值引用类型可以绑定到右值,并支持对其进行修改或移动。
变量作用域
一般来说有三个地方可以定义变量:
-
在函数或一个代码块内部声明的变量,称为局部变量。
-
在函数参数的定义中声明的变量,称为形式参数。
-
在所有函数外部声明的变量,称为全局变量。
1、全局作用域(Global Scope):在任何函数、代码块之外定义的变量具有全局作用域。这意味着它们在整个程序中都是可见和可访问的。全局变量在程序启动时被创建,在程序结束时销毁。
#include <iostream>int globalVariable = 10; // 全局变量int main() {std::cout << globalVariable << std::endl; // 可以在任何位置访问全局变量return 0;
}
2、块作用域(Block Scope):在函数或代码块内部定义的变量具有块作用域。这意味着它们只在定义它们的代码块内部是可见和可访问的。当代码块执行完毕后,变量将被销毁。
#include <iostream>int main() {int x = 5; // 块作用域的变量{int y = 10; // 嵌套的块作用域的变量std::cout << x << " " << y << std::endl; // 可以在代码块内部访问x和y}std::cout << x << std::endl; // 只能在外层代码块内部访问x// std::cout << y << std::endl; // 错误:y超出了作用域,无法访问return 0;
}
3、函数参数作用域(Function Parameter Scope):函数参数的作用域仅限于函数内部。它们在函数被调用时创建,并在函数执行完毕后销毁。
#include <iostream>void myFunction(int param) { // 参数param的作用域仅限于函数内部std::cout << param << std::endl; // 可以在函数内部访问参数param
}int main() {myFunction(5);// std::cout << param << std::endl; // 错误:参数param的作用域仅限于函数内部,无法在main函数中访问return 0;
}
4、类作用域(Class Scope):在类定义内部声明的变量具有类作用域。它们可以被类中的任何成员函数访问。
#include <iostream>class MyClass {
public:int classVariable; // 类作用域的变量void myMethod() {std::cout << classVariable << std::endl; // 可以在成员函数中访问类作用域的变量}
};int main() {MyClass obj;obj.classVariable = 10;obj.myMethod();return 0;
}
需要注意的是,当在内部作用域中声明的变量与外部作用域中的变量同名,内部作用域的变量会隐藏外部作用域的同名变量。
变量的作用域是C++中管理变量可见性和访问性的重要概念。了解变量作用域对于编写正确和清晰的代码非常重要。
相关文章:

学习c++的第二天
目录 数据类型 基本数据类型 typedef 声明 枚举类型 类型转换 变量类型 变量定义 变量声明 左值(Lvalues)和右值(Rvalues) 变量作用域 数据类型 基本数据类型 C 为程序员提供了种类丰富的内置数据类型和用户自定义的数…...

Android NDK开发详解之调试和性能分析的系统跟踪概览
Android NDK开发详解之调试和性能分析的系统跟踪概览 系统跟踪指南 “系统跟踪”就是记录短时间内的设备活动。系统跟踪会生成跟踪文件,该文件可用于生成系统报告。此报告有助于您了解如何最有效地提升应用或游戏的性能。 有关进行跟踪和性能分析的全面介绍&#x…...

AD9371 官方例程HDL JESD204B相关IP端口信号
AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 : AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射: AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 : AD9371 官方…...
蓝牙服务:优化体验,提高连接效率
文章目录 1. 对蓝牙连接进行优化2. 设备配对的缓存机制3. 优化蓝牙连接的稳定性 蓝牙技术已经成为我们生活中不可或缺的一部分,我们使用它进行音频传输、数据传输、设备连接等等。然而,有时蓝牙连接会让用户感到非常困扰,比如连接速度缓慢、连…...

SSM校园设备管信息管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目
选题理由 随着计算机网络及多媒体技术的广泛应用,互联网已成为高校办学的基础设施和必备条件,基于互联网的高校信息管理越来越综合化,越来越多的教学管理、行政管理工作将架构在互联网上,互联网正在变为学校实施教学、科研和管理…...

iOS的应用生命周期以及应用界面
在iOS的原生开发中,我们需要特别关注两个东西:AppDelegate和ViewController。我们主要的编码工作就是在AppDelegate和ViewControlle这两个类中进行的。它们的类图如下图所示: AppDelegate是应用程序委托对象,它继承了UIResponder类…...
Macos下安装使用Redis
Redis 是一个基于内存的key-value的结构数据库适合存储热点数据 Macos安装Redis https://redis.io/docs/getting-started/installation/install-redis-on-mac-os/安装redis brew install redis查看安装信息: brew info redis前台启动redis: redis-server后台启…...

Redis的四种部署方案
这篇文章介绍Reids最为常见的四种部署模式,其实Reids和数据库的集群模式差不多,可以分为 Redis单机模式部署、Redis主从模式部署、Redis哨兵模式部署、Cluster集群模式部署,其他的部署方式基本都是围绕以下几种方式在进行调整到适应的生产环境…...

Microsoft Edge不能工作了,可能原因不少,那么如何修复呢
Microsoft Edge打不开或不能加载网页是用户在Windows 10、Android、Mac和iOS设备上的网络浏览器上遇到的许多错误之一。其他Microsoft Edge问题可能包括浏览器窗口和选项卡冻结、网站崩溃、互联网连接错误消息以及丢失Microsoft Edge书签、收藏夹、密码和收藏。 Microsoft Edg…...

算法---缺失的第一个正数
题目 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。示例 1:输入:nums [1,2,0] 输出:3 示例 2:输入:nums …...
【算法与数据结构】--算法应用--算法和数据结构的案例研究
一、项目管理中的算法应用 在项目管理中,算法和数据结构的应用涉及项目进度、资源分配、风险管理等方面。以下是一些案例研究,展示了算法在项目管理中的实际应用: 项目进度管理: 甘特图算法:甘特图是一种项目进度管理…...

java如何获取调用接口的ip?
获取调用者的ip 场景:想知道哪个ip访问的某个接口时,就需要打印出来看看,这时就可以使用这个方法了。 案例: //HttpServletRequest 入参加上,请求对象public ForkResponse queryXXX(RequestBody XXXX xxxx, HttpServletRequest …...
ubuntu 18 更新git版本到 2.80.1
前言 使用gitlab的时候,发现下面这条语句不能用 git init --initial-branch XXX查看git version git version下载 wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.38.1.tar.gz 或者 https://git-scm.com/download/linux 或者去github上面下载…...

测试C#调用Aplayer播放视频(2:VideoPlayer源码学习)
参考文献1除了介绍Aplayer组件的用法之外,还提供有demo下载以供学习,本文学习并记录其中的使用方式。 VideoPlayer项目使用C#在VS2013开发,其解决方案中包括VideoPlayer和VideoPlayer两个小项目,前者基于.net framework4.0&am…...

YOLOv5 分类模型的预处理
YOLOv5 分类模型的预处理 flyfish 版本 6.2 将整个代码简化成如下代码 imgsz224 file "/home/a/Pictures/1.jpg" transforms classify_transforms(imgsz) im cv2.cvtColor(cv2.imread(file), cv2.COLOR_BGR2RGB) print(im.shape)im transforms(im) print(im.…...

25 行为型模式-备忘录模式
1 备忘录模式介绍 备忘录模式(memento pattern)定义: 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态. 2 备忘录模式原理 3 备忘录模式实现 /*** 发起人角色**/ public class Originator {private Strin…...

物联网AI MicroPython传感器学习 之 SHT3X温湿度传感器
学物联网,来万物简单IoT物联网!! 一、产品简介 Sensirion SHT3x-DIS湿度和温度传感器基于CMOSens传感器芯片,更加智能、可靠,精度更高。SHT3x-DIS具有增强的信号处理能力、两个独特的用户可选I2C地址,通信…...
int* p = new int[5]; int *p = new int[5]();delete[] p; delete p;区别是什么?
int main() {int *p new int[5]; // 分配包含5个整数的数组内存// 初始化数组元素for (int i 0; i < 5; i) {p[i] i * 10;}// 试图使用 delete p; 来释放数组内存delete p;delete[] p;// 打印数组元素for (int i 0; i < 5; i) {std::cout << "p[" &l…...
数据结构|基础知识定义
1.值传递、地址传递、值返回、地址返回 1> 值传递:普通变量作为函数参数传递是单向的值传递,只是将实参的值复制一份给形参变量,形参的改变不会影响实参的值,因为所在内存空间不同 如果传递的是地址,被调函数使用指…...

物联网AI MicroPython传感器学习 之 MFRC522 RFID射频IC卡感应模块
学物联网,来万物简单IoT物联网!! 一、产品简介 MFRC522是应用于13.56MHz非接触式通信中高集成度的读写卡芯片,其特点低电压、低成本、体积小的非接触式读写芯片。MFRC522支持MIFARE系列更高速的非接触式通信,双向数据…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...