【C语言】【指针数组与数组指针】_深入理解指针_3

在这里插入图片描述

1.指针数组:

指针数组的主语是数组,顾名思义就是存放指针的数组
数组内每个元素都存放着地址,每个地址又指向一块区域
书写形式举例:

int* parr[5]={&a,&b,&c,&d,&e};

用指针数组打印元素内存放地址中的数值:

#include<stdio.h>
int main()
{
    int a = 1, b = 2, c = 3, d = 4,e = 5;
    int* parr[5] = { &a,&b,&c,&d,&e };
    int i = 0;
    for (i = 0;i < 5;i++)
    {
        printf("%d ", *(parr[i]));
    }
    return 0;
}

在这里插入图片描述

1.1指针数组模拟二维数组:

只能说模拟,因为二维数组中的元素是连续存放的,而指针数组中的元素不是连续存放的

#include<stdio.h>
int main()
{
  int arr1[]={1,2,3,4,5};
  int arr2[]={2,3,4,5,6};
  int arr3[]={3,4,5,6,7};
  int* parr[3]={arr1,arr2,arr3};
  int i=0,j=0;
  for(i=0;i<3;i++)
  {
   for(j=0;j<5;j++)
   {
     printf("%d ",parr[i][j]);
   }
  }
  return 0;
}

在这里插入图片描述
细节理解:
在这里插入图片描述
数组指针中存放的是数组名,也就是每个数组首元素的地址,所以 arr[i] 指向的是一维数组 arr[i]=*(arr+i)
arr[i]认为是一维数组的数组名,arr[i][j]就指向一维数组中的某个元素

2.数组指针:

数组指针变量主语是指针,是用来存放数组的地址,能够指向数组的变量

int arr[]={1,2,3,4,5};
int (*p)[5]=&arr;

因为[ ]的优先级大于 * ,所以要加()保证 * 是先与 p 结合
数组指针初始化的时候,用 &数组名 获得数组地址
注意:int (*p)[5] 中 [5] 不能省略

2.1二维数组传参本质:

以前的二维数组传参,形参部分写的是二维数组的形式(行能省略,列不行)
在这里插入图片描述

二维数组每个元素都可以看成是个一维数组,即每一行都是一维数组
所以,二维数组传参的本质是将首元素(即第一个一维数组)的地址传了过去
形参部分写成指针形式时,只需第一个数组的元素个数即可

void test(int(*p)[5],int r,int c)

代码改变:

#include<stdio.h>
void test(int (*p)[5],int r,int c)
{
  int i=0,j=0;
  for(i=0;i<r;i++)
  {
    for(j=0;j<c;j++)
    {
      printf("%d ",p[i][j]);//或者:*(*(p+i)+j)
    }
  printf("\n");
  }
}
int main()
{
  int arr[3][5]={ {1,2,3,4,5},{2,3,4,5,6 } ,{3,4,5,6,7} };
  	test(arr, 3, 5);
  	return 0;
}

在这里插入图片描述
⼆维数组传参,形参的部分可以写成数组,也可以写成指针形式

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值