最后的魁拔 发表于 2019-12-23 22:54:55

双层指针?

第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;
}

Croper 发表于 2019-12-23 23:05:40

p2:整数数组的指针
*p2:整数数组
*p2+5:整数数组 ,偏移量为5个整数长度
*(*p2+5):整数

jackz007 发表于 2019-12-24 01:28:04

本帖最后由 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-24 08:07:43

本帖最后由 行客 于 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]
查看完整版本: 双层指针?