C语言提高-36讲: 指针数组和数组指针的使用

使用指针操作二维数组

数组指针  *p/*(p)[j]

指向二维数组元素的指针,一个地址,你需要的,只是这一个数组里面的各个元素
指向一维数组的指针,多个地址,能访问指定行的元素

指针数组  *a[i]
保存多个地址的时候,能表示多个数组 ,可以指向某一行的数组


Q:在定义二维数组及传递参数时,经常有指针类型不匹配问题,

二维数组的表达式有多种,它们的类型都是怎样的呢?

是不是定义任意形式的二维数组都可以呢?


R:下面分别以字符串二维数组和整数型二维数组讨论:

任务一:输出每一行的字符串

方案一:定义 char *name[],形参 char *name[]

#include <stdio.h>
void print(char *name[],int n);
int main( )
{
    char *name[]= {"Zhao", "Qian", "Sun", "Li", "Zhou"};
    print(name, 5);
    return 0;
}
void print(char *name[],int n)
{
    int i;
    for(i=0; i<n; i++)           
        printf("%s\n", name[i]);    //name[i]是指向第i行字符数组的指针
}


方案二:定义 char name[5][5],形参 char (*name)[5]

#include <stdio.h>
void print(char (*name)[],int n);
int main( )
{
    char name[5][10]={"Zhao", "Qian", "Sun", "Li", "Zhou"}; 
    print(name, 5);
    return 0;
}
void print(char (*name)[10],int n)
{
    int i;
    for(i=0; i<n; i++)           
        printf("%s\n", name[i]);    //name[i]是第i行的一维字符数组
}

可见,printf("%s",a);打印字符串,a既可以是指针,也可以是数组。



任务二:输出第三行的整型元素

方案一:定义int score[][4],形参 int (*p)[4]

#include <stdio.h>
void search(int (*p)[4],int n);
int main(){
    int score[3][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}};
    search(score,2);
    return 0;
}
void search(int (*p)[4],int n){
    int i;
    printf("No.%d: ",n);
    for(i=0;i<4;i++)
        printf("%4d",*(*(p+n)+i));
}



失败的方案:

将二维字符串数组定义成 char (*name)[5]



将二维整数型数组定义成 int (*score)[4]



将二维整数型数组定义成 int *score[4]




总结:

在定义整型二维数组时,只能定义成1)的形式,形参类型要匹配
1)int score[3][4]     int (*)[4]
2)int *p[4]               int **
3)int (*p)[4]            int (*)[4]
在定义字符串二维数组时,可以定义成4)/5)的形式,形参类型要匹配
4) char name[][10]     char (*)[10]
5) char *name[10]      char **
6) char (*name)[10]    char (*)[10]


可以看出:

二维数组名是一个数组指针,而非二级指针

指针数组的数组名等价于一个二级指针


对于二维数组int a[ROW][COLUMN]来说,行指针的本质就是一个指向包含
COLUMN个元素一维数组的指针,也就是int (*p)[COLUMN],
而列指针的本质就是一个指向元素的指针,也就是int *p;
比如int (*p)[3]; 它表示,数组 *p(p[0]) 具有三个int类型元素,分别为 (*p)[0] , (*p)[1] , (*p)[2]
即 p是指向一个具有三个int类型的一维数组的指针,也就是说,p为行数组指针


对于指针数组int *p[3]来说,p是一个二级指针,
p[0],p[1],p[2]均是一级指针,p[0]表示一个(元素是int类型的)数组



进一步思考,为什么可以用char *name[10]定义字符串二维数组,
却不能用int *score[4]定义整型二维数组呢?


再问:为什么不能用数组指针定义一个二维数组呢,与直接定义一个二维数组的区别在哪?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值