C语言——指针数组和数组指针

数组指针:指向多个数组的指针,本质是指针。

 一、定义:

存储类型 数据类型 (*变量名)[数组大小]    int (*p)[5]

二、初始化:

int arr[3][2]={1,2,3,4,5,6};

int (*p)[2]=arr;   //数组名是一个地址

p[0][0]   //表示取p数组的第一个元素ch1数组的第一个元素,即取'h'。

=*(p[0]+0)    //p[0]地址偏移0个数据单位,并对其取值

=(*(p+0))[0]    //p(首地址)偏移0个数据单位,得到ch1的地址对其下标[0]进行取值

=*((*(p+0))+0)   //p(首地址)偏移0个数据单位并取值得到ch1的地址,再偏移0个数据单位并取值,得到ch1的第一个元素,即'h'。

总结:对于数组指针取值,p[][]

          1:每去除一个[],就要加一个*进行取值。

          2:[]里的值变成+该值,表示地址偏移。

          3:由于[]的优先级高于*,所以需要用()确保优先级不改变。

          4:*和+虽然属于同一优先级,但其执行顺序是从右到左,所以也需要加()保证运算顺序。

小tip:当拿不准优先级或执行顺序时,可以按照逻辑顺序逐步加()保证执行顺序。

三、数组指针与二维数组之间的关系:

int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

int (*p)[4]=arr  //={arr[0],arr[1],arr[2]};    //等价于p[0]是arr[0][0]的地址,p[1]是arr[1][0]的地址,p[2]是arr[2][0]的地址

注意:int *p[4]的中的4表示p++一次偏移4个数据单位,因此指针数组操作二维数组时,[]中的数字为二维数组的列数。因此,数组指针又叫行指针。

 例1:给定一个二维数组char arr[3][10]={"Liu","LOVE","Song"},定义一个数组指针将二维数组中所有大写改为小写,小写改为大写。

{
char arr[3][10]={"Liu","LOVE","Song"};
char (*p)[10]=arr;   //=char (*p)[10]={arr[0],arr[1],arr[2]};
  for(int i=0;i<3;i++)  //遍历行
   {
    for(int j=0;j<10;j++)  //遍历列
      {
        //方式一:用数组下标的方式访问
        if('A'<p[i][j]&&p[i][j]<'Z')  //判断是否为大写
        p[i][j]+=32;    //等价于p[i][j]=p[i][j]+32;  //转换为Ascii码中小写,两者相差32
        else
        p[i][j]-=32;   //p[i][j]=p[i][j]-32;  //转换为大写

        //方式二:用地址偏移的方式访问
        if('A'<*(p[i]+j)&&*(p[i]+j)<'Z')  //等价于(*(p+i))[j]   //等价于*((*(p+i))+j)
        *(p[i]+j)+=32;
        else
        *(p[i]+j)-=32;
       }
   }
}

指针数组:存放多个指针的数组,本质是数组。

一、定义:

存储类型 数据类型 *数组名[数组大小]   eg:int *p[5]

二、初始化:

char ch1[] = "hello";//char *//&ch1 == char (*)[6]
char ch2[] = "world";
char * p[2]= {ch1,ch2};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值