先看一段代码,我们通过这个例子来近一步解读指针
#include <iostream>
using namespace std;
int main()
{
int n[][3] = { 10, 20, 30, 40, 50, 60 };
int(*p)[3]; //数组指针
p = n;
cout << p[0][0] << "," << *(p[0] + 1) << "," << (*p)[2] << endl;
system("pause");
结果输出什么呢?
答案输出的是 10,20,30 。那么为什么会输出这一组数据呢?
/*
p是数组指针,是指向2行3列的二维数组n的指针 但是p的值默认等于二维数组第一行的地址(即p的地址 == p[0]的地址), 第一行的地址也就是第一行首元素的地址
p[0] 是指向二维数组n的第一行的地址 p[0]的值默认等于二维数组n的第一行第一个数,也就是n[0][0]的地址
p[0] 是指向二维数组n第一行的地址,也就是指向{10,20,30}。 p[0][0]就是p[0]指向数组的的第一个元素, 就又相当一次解引用
(p[0]+1) p是数组指针 p[0]是指向二维数组的第一行,指针+1 还是指针 ,所以p[0]+1就是 指向p[0]这一行的下一个元素
p[0] 指向的是 10 20 30 这一行, p[0]的值等于这一行首元素的地址,也就是10这个元素的地址, p[0]+1就相当于指针往后移动一位,
指向20这个元素, 也就是p[0]+1的值等于20这个元素的地址(p[0]+1 = &n[0][1])。
所以 *(p[0]+1) 就相当于 n[0][1] 值为10 ; *(p[0]+2) 就相当于 n[0][2] 值为20
p是 数组指针 是指向数组p的指针
p[0] 是指向数组p的第一行的指针 p[0]的值等于 数组第一行[0]号元素的值,也就是n[0][0]的值
p[0] + 1 也是指针, 而与p[0] 不同的是p[0]+1是指向的是数组第一行[0]号元素的下一个也就是[1]号元素(p[0]+1是指向n[0][1]元素的)。
p[0]+1 的值和 n[0][1]的地址相同
因为p[0]+1 是地址, 而且是指向n[0][1]元素的, 所以解引用*(p[0]+1)就是 n[0][1]的值
p是数组指针 解引用就是一个数组
所以 (*p) 就是二维数组 的第一行 {10,20,30}
(*p)[2] 就相当于取这个数组中的下标为2的元素 也就是30 [] 就相当于一次解引用
(*p)+1 也是一个指针 (*p) 是指向第一行{10,20,30}的数组指针 , (*p)+1 是指向数组中的下标为1的元素
所以 *((*p)+1) 就是下标为1的这个值 20
总结 :
- []就相当于一次解引用
- 指针 +1 或者 -1 还是一个指针 只是指向的内容不一样