采用类比和等效法解决一个数组指针在指向数组中的元素时,又指向了一个p[size]数组理解
- 代码例图
char *lines[5] = //数组指针
{
"COSC1283/1984",
"Programming",
"Techniques",
"is",
"great fun"
};
char c2 = (*lines + 5)[5];
printf("c= %c \n",c2);//输出9
-
首先 lines 是一个char型数组指针,lines 代表了首元素地址---->{“COSC1283/1984”};解一层索引 *lines ,指针指向了首元素C的地址,(*lines +5)指针向后移动5位,指向了字符 ‘2’,此时可以把(*lines +5)等效成一个指向2的指针===》p,故(*lines + 5)[5]可以等效为p[5],p起始位置是字符’2’地址,等效成char *p[5]{“283/19”},此时是求p[5],字符‘2’下标是0,下标5对应元素为9,故答案9就是这么来的。
-
注意点
数组符号【】其实起到的是解引用的作用,类似于指针的 * ,故p[5]它包含了两个作用:第一个是p指针向后移动了5位,来到了字符9这个位置,然后【】解字符9的地址值,根据地址值指向拿到了字符9,就像平常数组我们通过下标拿值一样,在内存中每个数组都是有一个地址值的,我们要拿到数值只能通过地址值来去取,而平时数组取值我们是用arr[下标]这样方式取值,这其实经历着解地址值,通过地址值拿到数值的过程。 -
类比数组
int arr[] = { 1, 3, 5, 7, 9};
printf("%p\n",arr+4 );//0x7fff2306d010
printf("%d\n",arr[4]);//9
printf("%d\n",*(arr+4));//9
从当面代码的结果我们验证了我们的说法:数组下标[ ]起到解引用作用,*(arr +4)== arr[4];回到我们的原始问题,p[5]拿到字符9是不是也是一个道理呢,p是个指针,它指向了字符9的地址,通过p[ ]方式解索引拿到数值的逻辑是正的。