【C/C++】奇妙物语

预处理命令

指令意义
#空指令,无意义
#include包含一个源代码文件
#define定义宏
#undef取消已定义的宏
#if如果给定条件为真,则编译下面代码
#else如果#if给定的条件不为真,则编译下面代码
#elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码
#endif结束一个#if#else#elif条件编译块
#ifdef如果宏已经定义,则编译下面代码
#ifndef如果宏没有定义,则编译下面代码
#error停止编译并显示错误信息

预编译命令
#ifndef的用法
C语言中#define用法总结
c define作用域

数据类型

浅析uint8_t / uint16_t / uint32_t /uint64_t
__attribute__用法
C/C++的关系, namespace, struct , class
C/C++回调
C语言中,头文件和源文件的关系(转)

指针类型(Pointer)及引用类型(Reference)

讲指针变量之前,先要了解普通变量。

int i = 5;

系统会开辟一个内存地址(4byte),命名为i,内存存放的值是0x5;``

int i = 5;
int *p = &i; 

和普通变量一样,开辟一块内存地址,命名为p,内存存放的是i的内存地址。
&可以返回变量的内存地址。

int i = 5;
int &m = i;

和指针一样,m存放的是i的内存地址,但m是i的别名,m就是i。引用在定义的时候就要赋值,否则编译器就会报错。
在这里插入图片描述

声明与定义

声明:仅仅告诉变量的类型和名字。
定义:做了声明,还在系统分配了内存地址和大小。(分配了内存你就可以赋值了)
extern声明:真的只是声明。

// 声明
extern int a;
extern void main(int a,int b);// 函数声明和定义的区分比较简单,看有没有{}。
void main(int a,int b)// 函数声明的extern关键字可以省略。
// 定义
int a = 1;
extern int a = 1;// 虽然用了extern关键字修饰了,但是分配了内存地址,它就是定义。
void main(int a,int b){...}

在这里插入图片描述
在这里插入图片描述

“.”、"->"、"::"

::域运算符,左值为类(非对象)、命名空间等,右值为其成员。
->成员运算符,左值为指针,右值为其成员。
.成员运算符,左值为结构体、对象等,右值为其成员。

  1. A.B则A为对象或者结构体;
  2. A->B则A为指针,->是成员提取,A->B是提取A中的成员B,A只能是指向类、结构、联合的指针;
  3. ::是作用域运算符,A::B表示作用域A中的名称B,A可以是名字空间、类、结构;
  4. :一般用来表示继承;

动态内存

C++ 程序中的内存分为两个部分:
栈:在函数内部声明的所有变量都将占用栈内存。
堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。

new运算符可以申请一块动态分配的堆内存,它返回这块内存的地址,用delete运算符可以释放掉这块堆内存。

动态内存会引起两个问题:
1.new了不delete掉,叫内存泄漏。
2.delete了的指针又被用了,叫野指针。

所以引入了智能指针,

Android 中封装了sp<> 强指针,wp<>弱指针的操作。
强指针与一般意义的智能指针概念相同,通过引用计数来记录有多少使用者在使用一个对象,如果所有使用者都放弃了对该对象的引用,则该对象将被自动销毁。
弱指针也指向一个对象,但是弱指针仅仅记录该对象的地址,不能通过弱指针来访问该对象,也就是说不能通过弱智真来调用对象的成员函数或访问对象的成员变量。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值