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