C/C++ 的指针

指针变量也是变量,很多时候可以用普通变量的思维去思考和使用,与普通变量不同的是,普通变量装的一般的数据类型,指针变量装的是其它变量的指针(地址)

0. 指针数组

指针数组也就是指针的数组,它和普通数组的区别就是普通数组里面装的是常见的数据元素,指针数组里面装的是指针元素

int a = 1, b = 2, c = 3;
int* p[3] = {&a, &b, &c}; // p[1] == &b; p[1][0] == b;

下标运算符 “[ ]” 不是指针特有的,只要符合下标运算符的操作规则,就可以使用

下标运算符” [ ] “用法

下标运算符执行的操作是:*(地址+[偏移量])

由下标运算符的操作方法可以看出,下标运算不是数组特有的,例如:

int a[3] = {1, 2, 3};
int *p = a;

p[1] 相当于 (p+1) 也就是 a[1],更”奇葩”的是它还相当于 1[p],根据下标运算符的操作 1[p] 相当于 (1+p),这里的 “+1” 操作跨过的是 *p 类型的数据长度(这里是 4Byte ),也可以说步长是 4Byte

1. 数组指针

数组指针也称行指针,步长是整个数组的长度

int a[3] = {1, 2, 3};
int (*p)[3] = &a;
// 也就是表示:
p == &a;
*p == a;
(*p)[1] == a[1];

int b[2][3];
int (*q)[2][3] = &a;

注意

2. 数组名和指针的比较

区别

联系

数组传参时,会退化为指针

void fun (int a[]);
void fun (int* a);
// 这两个声明的效果是一样的,编译的过程中 void fun (int a[]); 中的数组会转化为指针形式
Table of Contents