美文网首页
char和char *

char和char *

作者: 请叫我魔法师 | 来源:发表于2017-11-15 15:04 被阅读0次

    星号 * 和取地址符&的关系

    1.星号 * 代表一个内存地址,是一个数字 ,说明这个变量是个指针。
    比如 char c = 'c';
    int *p = &c;
    p就是指针变量。是一个地址。比如0x1110011,还是个数字。
    用 * p表示指向这个地址的结果,就是这个地址上存放的数据。
    所以 * p 的打印结果是 'c';

    2.取地址符号&是对变量取地址,得到这个变量的地址。
    比如 int *p = &c;&c就是得到了"c"这个数据在内存中的地址。
    *p 的打印结果 'c',根据指针得到数据。

    所以星号 *+指针 结果是数据,&+数据 结果是地址。
    至于二级指针啥的,道理一样。指针是个基本数据类型,代表数据的内存地址。

    一、简单定义一个char类型的字符

        char ca = 'a';
    //    int ca = 97;
        printf("值 = %c\nASSIC码 = %d\n十六进制地址 = %p\n十进制地址 = %ld\n", ca, ca, &ca, &ca);
    
    结果如下 字符的打印.png

    在ASSCI的范围内127以下,每个字符都对应了一个数字。所以char类型可以说是int数字类型的。代码中用int定义ca,打印结果一样。
    所以在ASSCI范围内,数字和字符本质上一样的。只是显示形式不一样。
    比如a和97,如果想用字符的形式就用%c,如果想使用数字就用%d。
    直接对这个变量打印,如果用%c形式显示字符,如果用%d打印就显示数字。
    PS:十六进制地址和十进制地址结果数值相等。十进制看着方便些。

    二、字符串

    1.用数组形式定义数组
        char str1[] = "123abc";
        printf("%s\n直接打印 = %ld\n地址 = %ld\n\n", str1, str1, &str1);
    
        char first = str1[1];
        printf("%c\nASSIC码 = %d\n地址 = %ld\n", first, first, &first);
    

    结果


    数组打印.png

    可以看出,直接对字符串打印,显示内存地址,和取到的地址结果一样。

    2.用指针形式定义字符串
        char *str = "abc123";
        printf("%s\n地址 = %ld\n首字符 = %c\n首字符地址 = %ld\n\n",str, str, *str, &*str);
    
        while (*str != '\0') {
    
            printf("ASSIC码 = %d  值 = %c 地址 = %ld\n", *str, *str, str);
            str++; //地址+1
        }
    
    结果: 指针形式的字符串.png

    用指针形式定义字符串,表示了一个指向一个字符串的地址。其实这个地址指向了字符串的首字母。有了首字母的地址就相当于这个字符串的地址。就像你和你的家庭,知道了你的位置,就知道了你整个家庭的位置一样。
    星号 * str就是首字母。&*str就是首字母的地址,和str是同一个地址。

    下面遍历字符串。str是首字母地址,每次自加1,表示紧挨着的下一个地址,指向了下一个字符。结果显示,首字母地址和str一致,更加证明了指针形式的字符串,指针是字符串的首字母地址。

    相关文章

      网友评论

          本文标题:char和char *

          本文链接:https://www.haomeiwen.com/subject/bzecvxtx.html