<C>char/char*/char**数组

平时都用的是char数组,基本忘记了char*数组和char**数组该怎么用了

char s1[10];

s1[0] s1[1]等都是char

s1char*,等同于&s1[0]

 

char*s2[10];

s2[0] s2[1]等都是char*

*s2[0] *s2[1]等都是char,是s2[0] s2[1]指向的字符串的第一个字符

s2char**,等同于&s2[0]

 

char**s3[10];

s3[0] s3[1]等都是char**

*s3[0] *s3[1]等都是char*,是s3[0],s3[1]这些char**指针指向的那个char*指针

**s3[0] **s3[1]等都是char,是*s3[0] *s3[1]这些char*指针指向的字符串的第一个字符

s3char***,等同于&s3[0]

char s1[3];

         char*s2[3];

         char**s3[3];

         s1[0]='1';

         s1[1]='2';

         s1[2]='3';

         s2[0]=&s1[0];

         s2[1]=s1;

         s3[0]=&s2[0];

         s3[1]=s2;

内存中的数据如下图

[转载]char、char*、char**数组

 

 

明确这一点:指针的值就是它所指向的那个地址,对指针做*运算,就是把指针所指向的那个地址的值取出来

 

s1[0] s1[1] s1[2]存放的是字符

s1这个char*指针的值是0x0012ff60,说明s1这个char*指针指向的地址是0x0012ff60 这个地址处存放着s1[0]这个字符。

 

s2[0]是一个char*指针,指向字符串”1234”

*s2[0]是第一个字符 ‘1’

s2这个char**指针的值是0x0012ff4c,说明s2这个char**指针指向的地址是0x0012ff4c,这个地址处存放着一个char*指针,也就是s2[0]

s2[0]这个char*指针的值是0x0012ff60,和s1这个char*指针的值相同,说明s2[0]这个char*指针指向的地址也是0x0012ff60,这个地址存放着s1[0]这个字符。

         s2[0]=&s1[0];

         s2[1]=s1;

         因为s1等同于&s1[0],所以s2[1]这个char*指针的值也是0x0012ff60

 

 

         s3这个char***指针的值是0x0012ff38,说明s3这个char***指针指向的地址是0x0012ff38,这个地址处存放着一个char**指针,也就是s3[0]

         s3[0]这个char**指针的值是0x0012ff4c,和s2这个char**指针的值相同,说明s3[0]这个char**指针指向的地址也是0x0012ff4c,这个地址存放着s2[0]这个char*指针

s3[0]=&s2[0];

         s3[1]=s2;

         因为s2等同于&s2[0],所以s3[1]这个char**指针的值也是0x0012ff4c

 

     下面是一张简单的示意图

   [转载]char、char*、char**数组

char s1[4]="123";

          //char* s2=&s1[0];

          char* s2=s1;

          char**s3=&s2;

          cout<<s2<<endl;

          cout<<s3<<endl;

          cout<<*s3<<endl;

          printf("%dn",s3);

          printf("%xn",s3);

上面这段代码的输出如下图

[转载]char、char*、char**数组

1245012转成16进制就是12ff54

可以看到,cout<<s2输出的是s2这个char*指针指向的地址处存放的数据,是一个字符串。

cout<<s3  输出的是s3这个char**指针指向的地址处存放的数据,是一个char*指针(指针就是一个地址),其值是0012ff54,也就是说这个char*指针指向的地址是0012ff54

cout<<*s3 输出的是s3这个char**指针指向的那个char*指针所指向的地址处存放的数据,是一个字符串。

可以总结,打印输出一个指针,输出的是指针所指向的地址处所存储的数据

 

变量其实就是一个地址。普通变量比如int i,i这个变量名就等同于内存中为这个变量分配的地址中存放的数据,这里是一个4字节的整数。和汇编中的直接寻址是不是很像?

指针变量比如char*s,s这个变量名还是等同于内存中为这个变量分配的地址中存放的数据,不过这里的数据不是普通的整数或浮点数数据,而是一个4字节的地址。*s就是这个4字节的地址处存放的数据。是不是和汇编中的间接寻址很像?&s就是内存中为这个变量分配的地址。考虑到我们输出s的时候,输出的都是s这个地址处存放的数据,如果想知道s这个4字节地址本身的值,可以int i=(int)s。

[转载]char、char*、char**数组

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值