C++学习笔记系列2-39——指针和一维数组(1)

指针和数组的关系

指针和数组关系非常密切,在讲解他们之前先回顾一下数组的底层原理,即:数组一旦被初始化后,它的各个元素的内存就被分配好了,并且地址是连续的。如下:

内存地址:0x01 0x02 0x03 0x04 0x05

元素值: 1 2 3 4 5

索引号: 0 1 2 3 4

就是因为以上的特点,我们只要让指针获取到数组的起始位置,就可以通过指针的自增功能获取数组信息。也可以通过"数组名 + 索引号"方式获取数组信息。

指针和数组建立联系

指针和数组建立联系,首先要保证数组和指针的类型是一致的,否则无法建立联系,如:

#include <iostream>

using namespace std;

int main()

{

int arr 4 = { 1, 2, 3, 4} ;

int* p1 = arr ; // 这样数组和指针就建立了联系,这是最常用的方式,也是最方便的方式。

p1 = &arr 0 ; // 这种方式和上方的作用是一样的,但是有些繁琐,不建议使用

// 但从中看出,数组和指针建立联系的本质是:将数组第一个元素的地址赋值给指针

float* p2 = arr ; // 这个就会报错,因为类型不一致,此时我们可以将 p2 指针 "置空",在没有确切地址可以赋值时,将指针置空是一个安全操作。

p2 = nullptr ; // nullptr 是空指针,将其赋值给 p2 让其为空

// 通过"指针偏移"获取数组中元素

cout << "arr数组中第1个元素为:" << *p1 << endl;

// 以下的 " ++ " 符号一定写在指针前,否则会先读取数据再执行自增,即"先用再加"

cout << "arr数组中第2个元素为:" << *(++p1) << endl;

cout << "arr数组中第3个元素为:" << *(++p1) << endl;

cout << "arr数组中第4个元素为:" << *(++p1) << endl;

// 这是通过指针偏移,一个一个的读取内存中的数据后再输出,这个方式比较简陋,而且容易"越界",因此不建议使用,做到了解我们声明的指针可以通过偏移进行数据访问即可

}

输出:arr数组中第1个元素为:1

arr数组中第1个元素为:2

arr数组中第1个元素为:3

arr数组中第1个元素为:4