指针、数组、字符串:char*,char[],char**,char*[]的使用

一、三者的定义

(一)数组

//定义
char a[10];
char b[10][10];
//赋值
a[]={'a','b','c'};
a[10]={'a','b','c'};
a[10]={0};

(二)字符串

//定义
char s[10];
//赋值
s[]="abc";
s[10]="abc";
//输出
s[]="abc";
printf("s的值为 %s",s);    //s的值为 abc

(三)指针

//定义
char *p;
char **p;
//赋值
&p="abc";
p=a;//指向数组
p=s;//指向字符串
//输出
char i='a';
char *p;
p=&i;
printf("i的地址为%p",&i);            //i的地址为000000000061FE1F
printf("i的内容为%p",i);            //i的内容为0000000000000061
printf("p的内容为%p",p);            //p的内容为000000000061FE1F
printf("p指向内存的内容为%p",*p);    //p指向内存的内容为0000000000000061
printf("p的地址为:%p",&p);        //p的地址为:000000000061FE10

二、数组和指针

举例说明,例如

char a[10]={'a','b','c'};
char *p;
p=a;

则*p和a[0]的值均为a,*(p+1)和a[1]的值均为b,*(p+2)和a[2]的值均为c.

三、数组和字符串

二者差不多

四、指针和字符串

举例说明,例如

char s[10]="abc";
char *p;
p=s;

则*p和s[0]的值均为a,*(p+1)和s[1]的值均为b,*(p+2)和s[2]的值均为c.

五、char**和char*[]和char[][]

char *s[] = {"dong", "jin", "tao"};
char **p=s;

*s[]为指针数组,即一个存放指针的数组。

如上例,*s[]是一个存放了三个元素的数组,这三个元素为分别指向三个字符串的指针,s[0]为一个指针,指向字符串'qingdao'。

**p为指向指针的指针。

如上例,申请一个地址一存放一个指针,该指针指向地址二,地址二存放一个指针(即为*p,这里的*p类似于标题四中提到的s),该指针指向地址三。

char *s[] = {"dong", "jin", "tao"};
printf("s = %s", s);                //s =
printf("s: 0x%p",s);                //s: 0x000000000061FE00
printf("s[0] = %s",s[0]);            //s[0] = dong
printf("s[0]: 0x%p",s[0]);            //s[0]: 0x0000000000404000
printf("s[0][0] = %c",s[0][0]);        //s[0][0] = d    类似于二维数组的访问
printf("s[0][0]: 0x%p",&s[0][0]);        //s[0][0]: 0x0000000000404000

printf("*s = %s",*s);                    //*s = dong
printf("*(s + 1) = %s",*(s + 1));        //*(s + 1) = jin
printf("*(s + 2) = %s",*(s + 2));        //*(s + 2) = tao

char **p=s;
printf("p = %s", p);            //p = 
printf("p: 0x%p",p);            //p: 0x000000000061FE00    地址二,用来存放*p
printf("*p = %s" ,*p);        //*p = dong
printf("*p: 0x%p",*p);        //*p: 0x0000000000404000    地址三
printf("**p: 0x%p", **p);    //**p: 0x0000000000000064    dong中d的16进制表达

例如访问字符串"jin",可以用s[1]或*(s + 1);而对于字符串中字符"i"的访问,可以用s[1][1],也可用*(s + 1)[1],也可用*(*(s + 1) + 1)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值