C++ | C++ 基础知识 | 指针、数组与引用
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++ 基础知识 | 指针、数组与引用的更多相关文章
- c/c++ 数组 数组的引用,指针数组的引用
c/c++ 数组 知识点 1,数组的声明和初始化,对应代码里的test1和test2 2,char数组,对应代码里的test3 3,数组不可以拷贝和复制,对应代码里的test4 4,指针数组, 数组的 ...
- C/C++基础知识总结——数组、指针域、字符串
1. 数组 1.1 数组作为函数参数 (1) 如果使用数组作为函数的参数,则实参和形参都是数组名,且类型要相同.数组名做参数时传递的是地址 (2) 使用方法: void rowSum(int a[][ ...
- java 基础知识五 数组
java 基础知识五 数组 数组保存的是一组有顺序的.具有相同类型的数据. 同一个数组中所有数据元素的数据类型都是相同的. 可以通过数组下标来访问数组,数据元素根据下标的顺序,在内存中按顺序存放 ...
- 嵌入式-C语言基础:指针数组(和数组指针区分开来)
指针数组:一个数组,若其元素均为指针类型的数据,称为指针数组,指针数组存放的是指针类型的数据,也就是指针数组的每个元素都存放一个地址.下面定义一个指针数组: int * p[4];//[]的优先级是比 ...
- C语言基础知识(五)——数组与指针的等价表示
void f(void) { int * p; int a[3] = {1,2,3}; p = a; printf("%d %d", a[0], p[0], *(a+1), *(p ...
- C语言基础知识【数组】
2017年7月11日17:34:05C 数组1.C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量.数组的声明并不 ...
- 【学习】基础知识:数组和矢量计量【Numpy】
Numpy是高性能科学计算和数据分析的基础包.功能如下: ndarray 一个具有矢量算法运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环) 用于读 ...
- 【风马一族_php】NO5_php基础知识_数组
原文来自:http://www.cnblogs.com/sows/p/6032570.html (博客园的)风马一族 侵犯版本,后果自负 回顾 匿名函数 定义: 变量 = function [参数列表 ...
- PHP基础知识之数组
数组的定义: array( key => value , ... ) // 键(key)可以是一个整数或字符串,键可以省略,默认从0开始索引 // 值(value)可以是任意类型的值或者简写的方 ...
随机推荐
- python不得不知的几个开源项目
1.Trac Trac拥有强大的bug管理 功能,并集成了Wiki 用于文档管理.它还支持代码管理工具Subversion ,这样可以在 bug管理和Wiki中方便地参考程序源代码. Trac有着比较 ...
- 一个框架看懂优化算法之异同 SGD/AdaGrad/Adam
Adam那么棒,为什么还对SGD念念不忘 (1) —— 一个框架看懂优化算法 机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着 ...
- [转]移动APP安全测试
1 移动App安全风险分析 1.1 安全威胁分析 安全威胁从三个不同环节进行划分,主要分为客户端威胁.数据传输端威胁和服务端的威胁. 1.2 面临的主要风险 1.3 Android测试思维 ...
- seo优化:302跳转变为301跳转
<?php header("Location: http://www.XXX.com",TRUE,301); exit; ?> 要加exit;不加exit;还是会是30 ...
- 2018-2-13-WPF-DelegateCommand-出现Specified-cast-is-not-valid
title author date CreateTime categories WPF DelegateCommand 出现Specified cast is not valid lindexi 20 ...
- H3C NAPT
- SpringBoot+Thyemleaf开发环境正常,打包jar发到服务器就报错Template might not exist or might not be accessible
网上查看了各种解决的思路,总结如下: 1. 在controller层请求处理完了返回时,没有使用@RestController或@ResponseBody而返回了非json格式 这种情况下返回的数据t ...
- Spring Boot Admin-应用健康监控后台管理
Spring Boot Admin 用于监控基于 Spring Boot 的应用,它是在 Spring Boot Actuator 的基础上提供简洁的可视化 WEB UI. 1. 什么是Spring ...
- H3C 计算子网内可用主机地址数
- 2019-8-31-C#-await-高级用法
title author date CreateTime categories C# await 高级用法 lindexi 2019-08-31 16:55:58 +0800 2018-2-13 17 ...