双层指针?
第11行,*(*p2+i)为啥里面还要加*号呢?*p2+i不就是里面的值了吗?问了一下人是双层指针,实在是不懂#include <stdio.h>
int main(void)
{
int temp = {5,22,35,4656,515};
int (*p2) = &temp;//int (*p2) = temp,指针指向第一个数组元素的地址,实际上指向整型变量的指针
int i;
for(i=0;i<5;i++)
{
printf("%d\n",*(*p2+i));//多取了一次地址,所以p2也要加*号
}
return 0;
} p2:整数数组的指针
*p2:整数数组
*p2+5:整数数组 ,偏移量为5个整数长度
*(*p2+5):整数 本帖最后由 jackz007 于 2019-12-24 01:42 编辑
int (*p2) = & temp ;
这一句定义了一个指向末维为 5 的二维整型数组的指针 p2,就是说,p2 完全可以像二维数组那样被访问,例如,执行完上述语句后,p2 和 temp 之间存在如下对应关系:
p2 - temp
p2 - temp
. . . . . .
p2 - temp
如果用指针的形式来表达,对应关系为:
* ((* p2 + 0) + 0) - temp
* ((* p2 + 0) + 1) - temp
. . . . . .
* ((* p2 + 0) + 4) - temp
所以,对于二维数组的指针而言,要访问到数组元素,两层括号是必须的,可以把两层括号理解为多维数组指针 "降维" 。在本例中,由于第一维的索引始终为 0 值,所以,内层括号可以省去。
本帖最后由 行客 于 2019-12-27 07:15 编辑
如果想真正全面理解为什么会如此,首先要理解一下数组名:
数组名的本意是表示一组数据的集合,它和普通变量一样,都用来指代一块内存。如果你打印sizeof(temp),结果为20(在32位机器下为20,也就是4个int类型的宽度)。
但在使用过程中,数组名有时候会转换为指向数据集合的指针(地址),而不是表示数据集合本身。
这是因为:C语言标准规定,当数组名作为数组定义的标识符(也就是定义或声明数组时)、sizeof 或 & 的操作数时,它才表示整个数组本身,在其他的表达式中,数组名会被转换为指向第 0 个元素的指针(地址)。请一定注意,除了上面的三种情况(数组定义的标识符、sizeof 或 & 的操作数)外,数组名将会转换为指向第0个元素的指针。
也就是说,数组名在这三种外,数组名temp本身的类型为int*;而在这三种情况内,你使用取地址符&或检查长度sizeof时代表的是数组本身。所以你打印sizeof(temp),结果为20;你&temp的类型为int*。即
int* p1=temp; //p1指向的类型为int
int(*p2)=&temp; //p2指向的类型为int
所以,p2实际上是一个二维数组指针。
下面,我来进一步解释为什么p2是一个二维数组指针。
**** Hidden Message *****
页:
[1]