c语言 指针数组

字符数组:数组长度和存储长度不一样,除了存储内容外,字符数组将'\0'作为字符数组结束的标志,存储长度是数组长度加一。

通过strlen()算出的数组长度是内容长度,是存储长度减一。sizeof求数组的长度时:

char bbb[2]="12";
char ccc[]="12";

printf("bbb[2]: %d\n",sizeof(bbb));  //sizeof 求出是2
printf("ccc[2]: %d\n",sizeof(ccc));  //sizeof求出是3

指针数组:

int *p[3]={1,2,3}

char *c[2]={"123","456"};

char *c[]={"123","456"};   //数组在声明的时候可以缺省大小,但初始化必须是确定的内容

指针数组:数组的内容是指针。例如c[0]是指向字符串“123”的指针,c[1]是指向字符串"456"的指针。

指针数组的使用:

#include<stdio.h>
int main(){
    int a[]={1,3,4},b[]={5,7,9},*p[2];
    p[0]=a;
    p[1]=b;
    *p[0]=12;//使a[0]=12
    printf("%d  ",*p[0]);//12
    printf("%d  ",++*p[0]);//13 访问a[0],使a[0]自增
    printf("%d  ",*p[0]);//13
    printf("%d  ",*p[0]++);//13 访问a[0],print a[0],随后指针自增,p[0]指向a[1]
    printf("%d  ",*p[0]);//3
}

注意:++*s 表示对s指向的数据进行自增,s指向的位置不变;*s++ 表示访问了s指向的数据后,指针s自增,s指向原来数据的下一条数据


用指针数组表示多维数组;

这样不会有多为数组那样有严格的大小限制:

char *p={"i am hust","tomorrow is today","hahahahahahahahhahaha"};

上面就是相当于多维数组,在一维指针数组中让指针指向不同大小的字符串

#include <stdio.h>


void f(char **p)
{
    *p += 2;
    
}


int main(){
    char *a[] = {"123", "abc", "456"};
    char **p = NULL;
    p = a;
    printf("%s  ",a[0]);//123
    printf("%s  ",a[1]);//abc
    printf("%s  \n",a[2]);//456
    printf("%s  ",*p);//123
    printf("%s  ",*p+1);//23
    printf("%s  ",*p+2);//3
    printf("%s  ",*p+3);//输出空格
    printf("%s  ",*p+4);//abc
    printf("%s  ",*p+5);//bc
    printf("%s  ",*p+6);//c
    printf("%s  ",*p+7);//输出空格
    printf("%s \n ",*p+8);//456
    printf("%s  ",*(p+1));//abc
    printf("%s  ",*(p+2));//456
    printf("%c  ",*(*(p+2)+2));//6
    printf("%s  ",*(p+3));//overflow
    printf("%s  ",*(p+4));//overflow
    printf("\n\n\n");
    f(p);
    printf("%c\n", **p);//3    
    printf("%s\n", *p); //3   
    //printf("%s\n", **p); this is wrong
    return 0; 
}

p是二维数组,p指向a[0][0]的首地址,*p指向的是数组a[0]的首地址,则*p+1指向的a[0]第二位地址,则输出从第二位开始后面的字符串,*p+2 同上

p相当于是上一篇文章中指出的行指针,所以p+1,p+2等是在a[0],a[1]之间的移动.用法和上篇讲到的二维数组一样。但是在二维数组中不能这样声明二重指针: **p


#include<stdio.h>
int main(){
    char a[3]="abc";
    char *p=a;
    //printf("%c",a[2]);
    printf("%c",*(p+0));//abc
    printf("%c",*(p+1));//bc
    printf("%c\n",*(p+2));//c
    //printf("%c\n",*(p+3)); 乱码
    printf("%s\n",p);//abc+乱码
    printf("%s\n",p+1);//bc+乱码
    printf("%s\n",p+2);//c+乱码
    //printf("%s",p+3);
   // printf("%c",a[4]);
    printf("aa:\0");
    return 0;
}



  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值