下面几个输出都有什么区别呢?傻傻分不清。
#include <stdio.h>
#include<stdlib.h>
using namespace std;
int main(int argc, char* argv[])
{
int v[2][10] = {
{1,2,3,4,5,6,7,8,9,10},
{11,12,13,14,15,16,17,18,19,20}
};
int (*a)[10] = v;
printf("**a = %d\n", **a);
printf("**(a+1) = %d\n", **(a+1));
printf("*(*a+1) = %d\n", *(*a+1));
printf("*(a[0]+1) = %d\n", *(a[0]+1));
printf("*(a[1]+1) = %d\n", *(a[1]+1));
printf("*(a[1]) = %d\n", *(a[1]));
return 0;
}
我们说数组名相当于指向数组第一个元素的指针,这个一位数组的时候应该比较好理解。
理解多维数组也一样,例子中二维数组v[2][10], 该二维数组可以理解为包含两个元素v[0], v[1] , 其每个元素都是一个包含“10个整型元素”的数组,
该二维数组的第一个元素是v[0],是一个包含了“10个整型元素”的数组;a
对应数组名v, 指向数组第一个元素的指针, 想象指向的范围是第一整行;a+1
指向数组第二个元素,指向的范围是第二整行;*a
: 对应的是指向第一行第一个元素的指针,指向范围是第一行第一个元素;**a
在*a
基础上再取*
, 那么就是第一行第一个元素的值1;同理**(a+1)
是返回第二行第一个元素的值11;*a+1
是指向第一行第一个元素的指针加1,那么就是指向第一行第二个元素的指针,*(*a+1)
就是第一行第二个元素的值2;a[0]
是指向第一行第一个元素的指针,a[0] +1 就是指向第一行第二个元素的指针,*(a[0]+1)
返回值2;a[1]
是指向第二行第一个元素的指针,*(a[1])
返回值11;a[1] +1
是指向第二行第二个元素的指针,*(a[1]+1)
返回值12;
结果:
**a = 1
**(a+1) = 11
*(*a+1) = 2
*(a[0]+1) = 2
*(a[1]+1) = 12
*(a[1]) = 11
简单点可以试着这么理解:二维数组名指向的是第一行整行(二维数组的第一个元素),加*
以后"降"一级,指向的是该行中的第一个元素,再加*
,指向内容:值。
a
与 &a[0]
等价;a[0]
与 &a[0][0]
等价;a[0]
与 *a
等价;a[0][0]
与 **a
等价;
不知道有没有讲明白,希望能有帮助。