char和char *

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

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一致,更加证明了指针形式的字符串,指针是字符串的首字母地址。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,473评论 3 44
  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 1,759评论 0 4
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,364评论 0 6
  • 多线程、特别是NSOperation 和 GCD 的内部原理。运行时机制的原理和运用场景。SDWebImage的原...
    LZM轮回阅读 2,039评论 0 12
  • 03. 慕容建接了凤凰回来,家里却并没有人。他叹了口气,把凤凰放下,蹲下身子问她:“凤凰饿不饿呀?”凤凰揉揉肚子,...
    我站航红阅读 301评论 5 1