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. python中break和continue的区别

    python中break和continue的区别   break和continue 1.break 意思为结束循环   例: i = 0 while i<10:     i+=1     if ...

  2. 2019-6-23-win10-uwp-解决-SerialDevice.FromIdAsync-返回空

    title author date CreateTime categories win10 uwp 解决 SerialDevice.FromIdAsync 返回空 lindexi 2019-6-23 ...

  3. iptables rc.firewall脚本代码

    #!/bin/sh # # rc.firewall - Initial SIMPLE IP Firewall script for Linux 2.4.x and iptables # # Copyr ...

  4. css模仿ipad的日历

    https://www.cnblogs.com/sandraryan/ 题外话之:最近的练习用js之类的写起来会简单点,但是为了巩固基础,只好html和css硬怼页面X﹏X 这是一个日历的代码 注释有 ...

  5. Python--day62--Django安装,配置,web请求流程,views.py总结

    1,安装Django 2,创建Django项目: 3,配置Django项目 1.settinngs.py文件 1.templates文件夹的位置 2.静态文件 1,STATIC_URL   ----- ...

  6. pip安装python包时报字符编码错

    比如安装scikit-learn时报错: django ascii’ codec can’t encode character 原因是用户目录或用户名存在中文,ascii不能解码,解决办法是在Pyth ...

  7. linux 定时器 API

    内核提供给驱动许多函数来声明, 注册, 以及去除内核定时器. 下列的引用展示了基本的 代码块: #include <linux/timer.h> struct timer_list { / ...

  8. jquery核心基础

    jquery对对象的操作:   检查对象类型: 老式的javascript使用typeOf()操作符,但他是不符合逻辑的,在某些情况下,typeOf()返回的不是一个正确的值,或者返回一个出乎意料的值 ...

  9. 2018.10.26 浪在ACM 集训队第二次测试赛

    2018.10.26 浪在ACM 集训队第二次测试赛 整理人:苗学林 A海港 参考博客:[1]:李继朋https://www.cnblogs.com/violet-acmer/p/9859006.ht ...

  10. IDEA 创建普通的maven+java项目(入门)

    配置IDEA2017,maven3.5.2 ,Java1.8 其实大部分的IDEA都差不多,不用纠结版本之前的差异. 第一步:File-->New-->Project 第二步:出现new ...