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)可以是任意类型的值或者简写的方 ...
随机推荐
- webkit浏览器下多行显示,有省略号效果
多行显示情况 display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; ...
- 如果用HTML5做一个在线视频聊天【原创】
首先使用node.js 搭建一个简易的 websocket服务器: var cons = new Array(); var ws = require('ws').Server; var server ...
- Fragment学习(二): 管理Fragment和Fragment通讯
一. 管理Fragment 首先,如果你想在Android3.0及以下版本使用Fragment,你必须引用android-support-v4.jar这个包 然后你写的activity不能再继承自Ac ...
- LRJ
//3-1 #define _CRT_SECURE_NO_WARNINGS #include <cstdio> int main() { int T; ]; scanf("%d& ...
- Centos 6.5 配置hadoop2.7.1
1 Centos 6.5 编译hadoop2.7.1 主机配置: sudo yum install gcc gcc-c++ sudo yum install ncurses-devel sudo yu ...
- linux scull 中的设备注册
在内部, scull 使用一个 struct scull_dev 类型的结构表示每个设备. 这个结构定义为: struct scull_dev { struct scull_qset *data; ...
- Linux 内核接口
USB 端点被绑在接口中. USB 接口只处理一类 USB 逻辑连接, 例如一个鼠标, 一个键盘, 或者一个音频流. 一些 USB 设备有多个接口, 例如一个 USB 扬声器可能有 2 个接口: 一个 ...
- Educational Codeforces Round 61
Educational Codeforces Round 61 今早刚刚说我适合打pikmike出的EDU 然后我就挂了 A 不管 B 不管 C 这道题到快结束了才调出来 大概就是\(n^2\)枚举不 ...
- js实现防抖,节流
防抖函数. 将几次操作合并为一次操作进行.设置一个计时器,规定在延迟时间后触发函数,但是在延迟时间内如果再次触发,就会取消之前的计时器.如此,只有最后一次操作能触发.代码如下: function de ...
- dotnet 通过 WMI 获取系统启动的服务
本文告诉大家如何通过 WMI 获取系统启动的服务 通过 Win32_Service 可以获取系统启动的服务 获取的时候只需要拿Caption和State就可以 var mc = "Win32 ...