• C语言:constkeyword、结构体


    前几节内容的解说,主要是内存地址及指针的分析。这一节解说一下easy混淆的keywordconstant及结构体的知识。

    一、constkeyword

    1. 字符常量的指针

    char const *p1 = "hello";
    printf("指针的值:%p,指针所指向的值:%c
    ",p1, *p1);
    p1++;
    printf("指针的值:%p,
    ",p1);
    上例中。p1就是字符常量的指针,它的特点: 指针的值能够被改动。指针所指向的值不能被改动。

    因此。p1++ 这个操作是能够的,打印结果例如以下:

    指针的值:0x100000f22,指针所指向的值:h

    指针的值:0x100000f23

    我们再来试着书写 (*p1)++; 这个操作。首先通过 *p1 操作获得字符串 "hello" 中的 h, 然后进行 "++" 操作,然而此时,"hello" 是仅仅读的,所以这句代码在编译期间就会报错了。

    2. 字符的常量指针

    char *const p2 = "world";
    printf("指针的值:%p,指针所指向的值:%c",p2, *p2);
    上例中,p1就是字符的常量指针。它的特点: 指针的值不能够被改动,指针指向的值能够被改动。

    打印结果:

    指针的值:0x100000f64,指针所指向的值:w

    我们再来试着书写 p2++; 这个操作。此时在编译期间就会报错,由于 p2 是仅仅读的。


    *p2 = 'k';这个操作在编译期间不会报错,所以不违反"指针指向的值能够被改动"这一规则,可是它会在执行期间报错,由于字符串"world" 是存储在仅仅读存储区的。


    二、 结构体

    在C中,使用结构体能够把不同类型的值存储在一起,因此结构体是一些值的集合,这些值称为它的成员。

    在数组中能够通过下标訪问。仅仅是由于数组的元素长度同样。

    而结构体是不能够的,所以在结构体中,每一个成员都有自己的名字,他们是通过名字訪问的。

    结构体的申明

    方式一:基本声明

    struct {
        int a;
        char b;
        float c;
    } x;
    
    struct {
        int a;
        char b;
        float c;
    } y[20], *z;

    第一个结构声明创建了一个名字叫x得变量。它包括三个成员:一个整数,一个字符和一个浮点数。

    第二个结构声明创建了y和z,y是一个数组,它包括了20个结构。z是一个指针,它指向这个类型的结构。

    可是。这两个声明被编译器当做两种截然不同的类型。即使它们的成员列表全然同样,由于 z = &x; 是错误的写法。


    方式二:标签声明

    struct SIMPLE {
        int a;
        char b;
        float c;
    };
    标签同意多个声明使用同一个成员列表。

    这个声明把标签SIMPLE和这个成员列表联系在一起。该声明并没有提供变量列表,所以它并为创建不论什么变量。

    struct SIMPLE x;
    struct SIMPLE y[20], *z;
    z = &x;
    而且此时 z = &x; 是全然能够的。由于x与z所指向的结构是同一种类型的结构。


    方式三: typedef声明

    typedef struct {
        int a;
        char b;
        float c;
    } SIMPLE;
    这个技巧和声明一个结构标签效果差点儿同样。差别在于Simple如今是个类型名而不是个结构标签。

    所以兴许的声明可能像以下这个样子:

    SIMPLE x;
    SIMPLE y[20], *z;

    结构体的使用

    定义例如以下结构体

    typedef struct {
        int a;
        short b[2];
    } Ex2;
    
    typedef struct Ex {
        int a;
        char b[3];
        Ex2 c;
        struct Ex *d;
    } Ex;

    结构Ex2中有一个整形成员和一个short数组;结构Ex中有一个整形成员。一个字符数组,一个Ex2结构,一个指向Ex结构的指针变量。

    以下,对他们进行初始化工作

    Ex x = {10, "Hi", {5, {-1 ,25} }, 0};
    Ex *px = &x;
    分析一下结果:

    printf("px 存放的内容:%p
    ",px);
    px中存放的内容就是结构体x的地址。

    Ex accept = *px;
    *px就是获取px所指向的整个结构体的值。

    printf("结构x的变量a的值:%d,%d
    ",x.a, px->a);
    訪问结构体成员的两种方式:

    1. 结构体.变量名

    2. 指针名->变量名

    printf("结构x的变量a的地址:%p", &px->a);

    获取结构中成员变量的地址(注意:这里打印的地址尽管和px的地址一样。可是含义不同:px表示整个结构的地址,而&px->a表示结构x中变量a所在的地址。因为变量a是结构的首元素。所以和整个结构的地址是一致的)。


  • 相关阅读:
    js----定义变量的几种方式
    Vue----项目增加百度统计
    Vuex----核心概念和API
    Vuex----理解
    回到学校,国庆收假的第一天
    再次回到武汉
    收获的季节,最忙其实也是最没有收获的时光
    虚无缥缈的自信,一落千丈的打击
    愤怒、愤怒,终于适应了奔波
    总是骗人的你
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6918568.html
Copyright © 2020-2023  润新知