一维数组、二维数组、数组指针、指针数组的使用

#include "stdio.h"
void print3(char *p[])
{
    while(*p!=NULL)
    {
        puts(*p++);
    }
}
void print2(char **arr)
{
    int i;
    for(i=0;i<3;i++){
    printf("%d ",arr+i);
    printf("%s ",*(arr+i));
    }
    printf("\n");
    printf("%d %d %d\n",arr,arr+1,arr+2);//二维数组第一行到第三行各个一维数组元素
    printf("%s %s %s\n",*arr,*(arr+1),*(arr+2));//输出:for crr int
    printf("%d %d %d\n",*arr,*arr+1,*arr+2);//二维数组第一行地址各个元素
    printf("%c %c %c\n",*(*arr),*(*arr+1),*(*arr+2));//输出:f o r
    printf("%d %d %d\n",*(arr+1),*(arr+1)+1,*(arr+1)+2);//二维数组第二行地址各个元素
    printf("%c %c %c\n",*(*(arr+1)),*(*(arr+1)+1),*(*(arr+1)+2));//输出:c r r
    printf("%d %d %d\n",*(arr+2),*(arr+2)+1,*(arr+2)+2);//二维数组第二行地址各个元素
    printf("%c %c %c\n",*(*(arr+2)),*(*(arr+2)+1),*(*(arr+2)+2));//输出: i n t
    printf("\n");
}
void print1(char *arr[])
{
    int i;
    for(i=0;i<3;i++){
    printf("%d ",&arr[i]);
    printf("%s ",arr[i]);
    }
    printf("\n");
}
int main(void)
{
    int i=0;
    char a[5]={'A','K','C','G','L'};
    char *q;
    char (*p)[5];
    //char (*p)[5]=a;这样是错误的,因为a代表第一个元素的首地址
    char c[3][4]={"for","crr","int"};
    char (*pp)[4];
    char *pa[]={"for","crr","int"};
    char *pb[]={"FORTRAN","ABCDEFD","ABCDE++",NULL};//如果一个指针数组大小不确定,则可以在指针数组的末尾设置NULL
    char *p1[]={"FORTRAN","C","C++","aa"};
    char p2[][8]={"FORTRAN","C","C++"};
    char *q2;
/*******************普通指针*******************************/
    printf("****普通指针****\n");
    q=a;//首元素地址
    printf("%d %d %d\n",q,q+1,q+2);//地址
    printf("%c %c %c\n",*q,*(q+1),*(q+2));//输出:A K C
    printf("****对于一维数组使用数组指针****\n");
/*******************对于一维数组使用数组指针*******************************/
    p=&a;//&a代表的是整个数组的首地址
    printf("%d %d %d\n",*p,(*p+1),(*p+2));//地址
    printf("%c %c %c\n",**p,*(*p+1),*(*p+2));//输出:A K C
    printf("***对于二维数组使用数组指针***\n");
/*******************对于二维数组使用数组指针*******************************/
    pp=&c[0];//(或者pp=c)c代表c[0]的地址,即c=&c[0],代表的是数组的第一行的首个地址;
    printf("%d %d %d\n",pp,pp+1,pp+2);//二维数组第一行到第三行各个一维数组元素
    printf("%s %s %s\n",*pp,*(pp+1),*(pp+2));//输出:for crr int
    printf("%d %d %d\n",*pp,*pp+1,*pp+2);//二维数组第一行地址各个元素
    printf("%c %c %c\n",*(*pp),*(*pp+1),*(*pp+2));//输出:f o r
    printf("%d %d %d\n",*(pp+1),*(pp+1)+1,*(pp+1)+2);//二维数组第二行地址各个元素
    printf("%c %c %c\n",*(*(pp+1)),*(*(pp+1)+1),*(*(pp+1)+2));//输出:c r r
    printf("%d %d %d\n",*(pp+2),*(pp+2)+1,*(pp+2)+2);//二维数组第二行地址各个元素
    printf("%c %c %c\n",*(*(pp+2)),*(*(pp+2)+1),*(*(pp+2)+2));//输出: i n t
    printf("****指针数组****\n");
/*******************指针数组*******************************/
    //指针数组最主要的用途是对多个字符串进行处理操作,因为字符指针比二维数组更快更有效。
    print1(pa);
    print2(pa);
    print2(pb);
    printf("***指针数组和二维数组的区别***\n");
/****************数组指针、指针数组和二维数组的区别**********************************/
    printf("%d %d %d %d %d %d %d\n",sizeof(q),sizeof(p),sizeof(pp),sizeof(pa),sizeof(pb),sizeof(p1),sizeof(p2));
/*********************二维数组用列指针定义*********************************/    
    q2=&c[0][0];//或者p2=c[0];或者p2=*c;p代表第一行第一个元素的地址
    for(i=0;i<3*4;i++)
    {
        printf("%d   ",q2+i);
        printf("%c\n",*(q2+i));
    }
    return 0;
}
/********
int a[3][4];
a:代表a[0]的地址,即:a=&a[0],a[0]代表a[0][0]的地址,即a[0]=&a[0][0];
a+1:代表a[1]的地址,即:a+1=&a[1],a[1]代表a[1][0]的地址,即a[1]=&a[1][0];
a+2:代表a[2]的地址,即:a+2=&a[2],a[2]代表a[2][0]的地址,即a[2]=&a[2][0];
二维数组的传递有两种方式:
一种是行指针传递,例如上面的代码(p=&a[0],p指向了第一行的地址);
一种是列指针传递(看下面的介绍)。上面代码中p代表二维数组第一行的地址,
则*p代表第一行的第一个元素的地址,*p+1代表第一行的第二个元素的地址,
再*(*p+1)则输出了第二个元素;
同理,p+1代表第二行的地址,
*(p+1)代表第二行第一个元素的地址,
*(p+1)+1代表第二行第二个元素的地址
******************/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值