指针的定义
-
在c/c++中,有一个特殊的变量指向我们电脑中某个内存地址,进而可以让我们操作这段内存,指的就是指针类型
-
语法:
int a = 10; int* p = &a;
-
&
符号是取出某个变量的内存地址 -
把这个内存地址赋值给一个变量p,而接收我们内存地址的变量类型就为
类型*
指针类型 -
因为a的类型为int,所以a的指针类型为
int*
-
*p
是取出该地址的值#include <iostream>using namespace std;int main() {int a = 10;int *p = &a;cout << "a的值:" << a << endl;cout << "a的内存地址:" << p << endl;cout << "取指针p内存地址的值:" << *p << endl;return 0; }
-
通过指针操作a的值
// 通过*p修改a的值 *p = 58; cout << "修改后的a的值:" << a << endl;
指针数组
原生数组中的地址
-
可以看到数组中元素的地址是连续的,因为int为四个字节,所以每次地址都加4
#include <iostream>using namespace std;int main() {int a[] = {1, 2, 3, 4, 5};// 循环取址for (int &i: a) {cout << &i << endl;}return 0; }
-
直接打印数组的内存地址和数组内第一个元素的内存地址是一样的
cout << "直接打印数组的地址:" << &a << endl; cout << "打印数组第一个元素的地址:" << &a[0] << endl;
创建存放指针的数组
- 语法:
int* a[指针数组的大小];
- 使用指针数组操作数组
#include <iostream>using namespace std;int main() {int a[] = {1, 2, 3, 4, 5};int *p_a[5];for (int i = 0; i < 5; i++) {p_a[i] = &a[i];}for (int *i: p_a) {cout << i << endl;cout << *i << endl;}for (int *i: p_a) {*i = 1516;}cout << "=======" << endl;for (int *i: p_a) {cout << *i << endl;}return 0; }
多级指针
-
指针也是一个变量,变量都有地址,所以指针类型也有他的地址
-
其实某个变量的指针就是把该变量十六进制的内存地址存放到了指针类型的变量里
-
直接打印a变量的地址和打印a变量的指针内容是一样的
#include <iostream>using namespace std;int main() {int a = 20;cout << &a << endl;int *p_a = &a;cout << p_a << endl;return 0; }
-
所以指针可以有多级
- 这里其实是p_a指针指向了a的内存地址,pp_a指向了指针p_a的内存地址,ppp_a指向了pp_a的内存地址,所以取值的时候三次*可以取出来a的值。
#include <iostream>using namespace std;int main() {int a = 20;int *p_a = &a;int **pp_a = &p_a;int ***ppp_a = &pp_a;cout << ***ppp_a << endl;return 0; }
指针类型占用的字节
-
前面说了指针的内容就是一个十六进制的内存地址,所以为数字,我们打印指针类型的大小为8个字节,所有的指针类型都为8个字节
#include <iostream>using namespace std;int main() {int a = 20;int *p_a = &a;char b = 'a';char *p_b = &b;cout << sizeof p_a << endl;cout << sizeof p_b << endl;return 0; }
指针的加减
-
指针的加减随指针类型改变,例如int为4个字节,
int *
类型的指针+1就是+4个字节,long long类型为8个字节,long long*
类型的指针+1就为+8个字节#include <iostream>using namespace std;int main() {int a = 20;int *p_a = &a;long long c = 10;long long*p_c = &c;cout << "int *类型的加1" << endl;cout << p_a << endl;cout << p_a + 1 << endl;cout << p_a + 2 << endl;cout << "long *类型的加1" << endl;cout << p_c << endl;cout << p_c + 1 << endl;cout << p_c + 2 << endl;return 0; }