1.指针

在 C++ 语言中存放及使用内存地址是通过指针和引用完成的。

char c  = 'a';  // 声明 c 变量,c 变量存储的是 'a' 的值。
char* p = &c; // 声明 p 变量,p 变量存储的是 c 的指针。 & 是取地址符
char** q = &p; // 声明 q 变量,q 变量存储的是 p 的指针。 & 是取地址符,q 存储的是指针的指针
char c2 = *p // c2 = 'a',*符号是解引用运算符。

存储如下图:

1.1 void * 指针

void* 的含义是 ”指向未知类型对象的指针“。
void* 最主要的用途是当我们无法假定对象的类型时,想函数传递指向该对象的指针,它还用于从函数返回未知类型的对象。当使用这种未知对象时候,必须先进行显式类型转换。

用到 void* 指针的函数通常位于系统的最底层,这些函数的作用大多是操作硬件资源
eg: void * my_alloc(size_t n);

1.2 nullptr 表示空指针,即不指向任何对象的指针。

nullptr 表示空指针,不指向任何对象的指针。nullptr 只能用于指针类型。
未引入 nullptr 之前,通常用 0 表示空指针
int* x = 0
C 语言中通常使用 NULL 来表示空指针,在 C++ 中 NULL 语法是非法的。
int* x = NULL -> int* x = (void *)0

2.数组

    float a[32];  // 包含 32 个float的数组,依次是 a[0] ... a[31];
char* a[32]; // 包含 32 个char指针的数组,依次是 a[0] ... a[31];

数组应注意空间分配越界问题,数组的初始化与C相同。

2.1 数组初始化

数组初始化,编译器会根据列表包含的元素数量自动计算数组大小。如果制定了数组的大小,但提供的初始化器列表元素数量过多,则程序会发生越界错误。

char v3[2] = {'a', 'b'}

2.2 大字符集

前缀是 L 的字符串由宽字符组成,类型是 const wchar_t[]
Unicode 本身至少有 3 种编码方式:UTF-8,UTF-16,UTF-32。
UTF-8 字符串的结尾是 '\0'
UTF-16 字符串的结尾是 u'\0'
UTF-32 字符串的结尾是 U'\0'

cout << "folder\\file"   << endl;   // 字符串
cout << R"(folder\file)" << endl; // 原始字符串
cout << u8"folder\\file" << endl; // UTF-8字符串
cout << u"folder\\file" << endl; // UTF-16字符串
cout << U"folder\\file" << endl; // UTF-32字符串

2.3 数组中的指针

数组名可以看成是指向数组首元素的指针。

int v[] = {1,2,3,4};
int* p1 = v;
int* p2 = &v[0]
int* p3 = v + 4;

2.4 传递数组

不能以值传递的方式直接把数组传给函数,通常传递的是指向数组首元素的指针。

2.5 多维数组

多维数组是指数组的数组。
int array[3][5];

for(int i = 0; i != 3; i++)
for(int j = 0; j != 5; j++)
array[i][j] = 10 * i + j;

3.引用

通过使用指针,能以很低的代价在一个范围内传递大量数据,与直接拷贝所有数据不同,只需要传递指向这些数据的指针的值。指针类型决定了我们能对指针所指的对象进行哪些操作。
引用和指针的区别主要包括:

  • 访问引用与访问对象本身从语法形式上看是一样的。
  • 引用所引的永远是一开始初始化的那个对象。
  • 不存在 "空引用",可以认为引用一定对应着某个对象。

3.1 左值引用

int  p = 1;  // p 的内存地址为:0x7ffeefbff55c
int& r{var}; // r 的内存地址为:0x7ffeefbff55c
int q{var}; // q 的内存地址为:0x7ffeefbff54c
int x = r; // x 的内存地址为:0x7ffeefbff55c

C++ | C++ 基础知识 | 指针、数组与引用的更多相关文章

  1. c/c++ 数组 数组的引用,指针数组的引用

    c/c++ 数组 知识点 1,数组的声明和初始化,对应代码里的test1和test2 2,char数组,对应代码里的test3 3,数组不可以拷贝和复制,对应代码里的test4 4,指针数组, 数组的 ...

  2. C/C++基础知识总结——数组、指针域、字符串

    1. 数组 1.1 数组作为函数参数 (1) 如果使用数组作为函数的参数,则实参和形参都是数组名,且类型要相同.数组名做参数时传递的是地址 (2) 使用方法: void rowSum(int a[][ ...

  3. java 基础知识五 数组

    java  基础知识五  数组 数组保存的是一组有顺序的.具有相同类型的数据. 同一个数组中所有数据元素的数据类型都是相同的. 可以通过数组下标来访问数组,数据元素根据下标的顺序,在内存中按顺序存放 ...

  4. 嵌入式-C语言基础:指针数组(和数组指针区分开来)

    指针数组:一个数组,若其元素均为指针类型的数据,称为指针数组,指针数组存放的是指针类型的数据,也就是指针数组的每个元素都存放一个地址.下面定义一个指针数组: int * p[4];//[]的优先级是比 ...

  5. C语言基础知识(五)——数组与指针的等价表示

    void f(void) { int * p; int a[3] = {1,2,3}; p = a; printf("%d %d", a[0], p[0], *(a+1), *(p ...

  6. C语言基础知识【数组】

    2017年7月11日17:34:05C 数组1.C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量.数组的声明并不 ...

  7. 【学习】基础知识:数组和矢量计量【Numpy】

    Numpy是高性能科学计算和数据分析的基础包.功能如下: ndarray 一个具有矢量算法运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环) 用于读 ...

  8. 【风马一族_php】NO5_php基础知识_数组

    原文来自:http://www.cnblogs.com/sows/p/6032570.html (博客园的)风马一族 侵犯版本,后果自负 回顾 匿名函数 定义: 变量 = function [参数列表 ...

  9. PHP基础知识之数组

    数组的定义: array( key => value , ... ) // 键(key)可以是一个整数或字符串,键可以省略,默认从0开始索引 // 值(value)可以是任意类型的值或者简写的方 ...

随机推荐

  1. Vue 路由的嵌套使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. python基础七之copy

    浅拷贝 没有嵌套,则copy后完全不同,有嵌套,则copy后本体不同,嵌套相同. l1 = [1, 2, [4, 5, 6], 3] l2 = l1.copy() print(l1 is l2) # ...

  3. .net连接数据库

    /* 连接数据库步骤-- 1.创建连接字符串 data source = ... 计算机名称 initial catalog = ... 数据库名称 integrated security = tru ...

  4. Apply,Call,bind对比

    apply.call call和apply都是为了改变上下文背景存在的,即改变函数内部指向 javascript一大特点是函数存在定义时的上下文,运行时的上下文和上下文可改变的概念 apply.cal ...

  5. Resharper 去掉注释拼写

    最近在 Resharper 的 2018.2.1 的版本,提供了单词拼写功能,如果自己写错了单词,可以在 Resharper 提示 Resharper 的拼写 在 Resharper 的 2018.2 ...

  6. Python15_包的安装和管理

    pip的安装及简单使用:https://www.cnblogs.com/csucat/p/4897695.html 使用pip手动安装第三方库:https://blog.csdn.net/github ...

  7. AOP 事物连接,记忆连接数据库,连接池

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns:xsi="http://www ...

  8. Cortex-A9 Timing

    在Cortex-A9的文档<Cortex-A9 NEON Media Processing Engine>Technical Reference Manual中有关于Instruction ...

  9. JMeter Web测试计划

    在本节中,将学习如何创建测试网页的基本测试计划. 出于演示测试目的,我们将测试URL - https://www.yiibai.com/ 的网页性能. 创建JMeter测试计划 进入到JMeter安装 ...

  10. 以windows服务方式快速部署免安装版Postgres数据库

    目录 以windows服务方式快速部署免安装版Postgres数据库 1.下载Postgresql数据库免安装包 2.安装环境准备及验证 解压文件 测试环境依赖 3.创建并初始化数据目录 创建数据目录 ...