关于字符数组、字符串、字符指针、字符指针数组

int main()
{
    char str1[]="abc";
    char str2[]="a\0bc";
    //字符数组(没有以'\0'结束)
    char str3[]={'a','b'};
    char str4[]="哈";
    /*
     1.printf()中的%s占位符,在输出字符串时,只匹配到'\0'字符结束
     2.strlen()函数计算字符数量时同样只匹配到'\0'字符结束
     3.str3[]没有存放结束符'\0',
       因此用%s、strlen()时会匹配超出次字符串范围的'\0'作为结束位置

     低位

     内存位置       变量名称        存放内容
     ff1            str4           "哈"
     ff2            str3          {'a','b'}
     ff3            str2          "a\0bc"
     ff4            str1           "abc"

     高位

     因为内存中数组内容的存放顺序是从低位到高位(与变量存储方式相反)
     因此在输出str3时会依次从内存中找到'a'、'b'再向高位找到str2的'a'
     直到'\0'才结束

     4.中文在64位编译器中占用3个字符
     */
    printf("strlen(\"%s\")=%lu, strlen(\"%s\")=%lu\n",str1,
        strlen(str1),str2,strlen(str2));
    printf("strlen(\"%s\")=%lu, strlen(\"%s\")=%lu\n",str3,
        strlen(str3),str4,strlen(str4));

    char *p=str1;

    /*
     str1   --相当于-- 数组首地址(第一个元素的地址)
     str1+1 --相当于-- 数组第二个元素的地址
     *p     --相当于-- p[0]
     *(++p) --相当于-- p[1]
     p      --相当于-- 数组首地址
     ++p    --相当于-- 数组第二个元素的地址
     */

    //使用%c一定要保证后边的输出参数为值,而不是地址
    //不能写成printf("%c",p)
    printf("str1[0]=%c, p[0]=%c\n",str1[0],p[0]);
    printf("*(str1+1)=%c, *(++p)=%c\n",*(str1+1),*(++p));


    printf("-------------------------------\n");


    char *p1="abc";
    char *p2="a\0bc";



    //数组如果设置为s1[2][3]则会因为长度不够无法存储'\0'
    char s1[2][4]={"abc","def"};
    char *p3[]={"ABC","DEF"};

    /*
     数组的名字相当于数组首元素的地址,指向字符串的字符指针所存放的地址也相当于字符串首地址

     因此printf("%s",数组名字[数组首元素地址])
                --相当于--
     printf("%s",指针名字[数组首元素地址])

     *s1   == *s1[0]
     *p3   == *p3[0]
     */
    printf("*p1=%c\n",*p1);
    printf("*++p1=%c\n",*++p1);
    p1--;
    printf("p1[2]=%c\n",p1[2]);

    printf("s1=%s\n",s1);
    printf("s1[0]=%s\n",s1[0]);
    printf("*p3=%s\n",*p3);
    printf("strlen(\"%s\")=%lu, strlen(\"%s\")=%lu\n",
            p1,strlen(p1),p2,strlen(p2));

    printf("-------------------------------\n");


    /*
     size1=数组的总大小/数组单维度大小
     size2=指针数组总大小/单个字符指针大小
     */
    int size1=sizeof(s1)/sizeof(s1[0]);
    int size2=sizeof(p3)/sizeof(char *);
    printf("size1=%d, size2=%d\n",size1,size2);

    for(int i=0;i<size1;i++)
    {
        printf("s1[%d]=%s\n",i,s1[i]);
    }
    for(int i=0;i<size2;i++)
    {
        printf("*p3[%d]=%s\n",i,p3[i]);
    }
    return 0;

}

输出结果

strlen("abc")=3, strlen("a")=1
strlen("aba")=3, strlen("哈")=3
str1[0]=a, p[0]=a
*(str1+1)=b, *(++p)=b
-------------------------------
*p1=a
*++p1=b
p1[2]=c
s1=abc
s1[0]=abc
*p3=ABC
strlen("abc")=3, strlen("a")=1
-------------------------------
size1=2, size2=2
s1[0]=abc
s1[1]=def
*p3[0]=ABC
*p3[1]=DEF
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值