C/C++指针与二维数组与函数形参(int类型举例)

通过指针变量指向一个二维 int 类型数组元素:

int a[3][5]={
   
   {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};   //定义一个数组名为 a  3行5列的整型数组
int (*p)[5];         //定义一个变量名为pa的int类型指针变量。这个指针变量指向一个长度为5的数组,
                   //pa + 1 就相当于 &a[0][0] + 5,指向下一行的首地址
p=a;
printf("**(p+1) = %d;\n",**(p+1));	 // 输出 6
printf("**p+1 = %d;\n",**p+1);	 // 输出 2


int * pa = (int *)a;     //定义一个指向整型变量的指针,这里的 p + 1 就是指向了下一个元素。
printf(" *pa = %d;\n",*(pa+1));    //输出 2
p = &a[0][0];        //让指针变量p指向数组a的a[0][0]元素
p = &a[2][2];        //让指针变量p指向数组a的a[2][2]元素

Note:

在二维数组中数组名表示指针的指针,它是一个指向一维数组的数组名,

int * pa = (int *)a;  因为这里有强制转换符(int *) 因此就将这个指针的指针转成 单纯的int * 类型, 因此 *pa 就是a[0][0]

下面这个就是将数组名直接赋值给一个指向长度为 5 数组指针

int (*p)[5];

p=a;

因为是地址的地址因此 &a 其实就是获取了一个指向一维数组的指针值, 这个指针值加1 就相当于加了一个一维数组的长度

因为是地址的地址因此 *a 也是一个指针。  **a 才是 a[0][0] 这个元素

 

 

指针操作 数组操作 说明
int (*p)[5]; a 二维数组名,指向一维数组a[0] 0首地址
p=a; a[0] 0 行 0列元素地址 , a[0][0] 的地址
int * pa = (int *)a; *(a+0) 0 行 0列元素地址, a[0][0] 的地址
int * pa = (int *)a; *a 0 行 0列元素地址
  a + 1 第一行首地址
  &a[1] 第一行首地址
  a[1] 1 行 0列元素地址,a[1][0]的地址
  *(a + 1) 1 行 0列元素地址,a[1][0]的地址
  a[1] + 2 1 行 2列元素地址,a[1][2]的地址
  *(a+1)+2 1 行 2列元素地址,a[1][2]的地址
  &a[1][2] 1 行 2列元素地址,a[1][2]的地址
  *(a[1]+2) 1 行 2列元素,a[1][2]
  *(*(a+1)+2) 1 行 2列元素,a[1][2]
  a[1][2] 1 行 2列元素,a[1][2]

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/yuupengsun/article/details/114240207