zoukankan      html  css  js  c++  java
  • C语言学习结构

    结构

    一.声明结构类型

    #include <stdio.h>
     
     struct date {  //声明结构类型,把结构放在外面,所有函数就都能使用 
         int month;
         int day;
         int year;
     };
     
     int main(int argc, char const *argv[])   
     {
         struct date today;  //定义了一个struct date 类型的变量today 
         
         today.month = 9;
         today.day = 10;
         today.year = 2019;
         
         printf("Today's date is %i-%i-%i.
    ",today.year,today.month,today.day);
         
         return 0;
     }

    • 和本地变量一样,在函数内部声明的结构类型只能在函数内部使用

    • 所以通常在函数外部声明结构类型,这样就可以被多个函数所使用了

    二.声明结构的形式

     对于第一和第三种形式,都声明了结构point。但是第二种形式没有声明point,只是定义了两个变量

    三.结构变量

    struct date today;
    today.month=06;
    today.day=19;
    today.year=2005;

     四.结构成员
    • 结构和数组有点像
    • 数组用[]运算符和下标访问其成员
    • a[0] = 10;
    • 结构用.运算符和名字访问其成员
    • today.day
    • student.firstName
    • p1.x
    • p1.y

    五.结构运算

    要访问整个结构,直接用结构变量的名字
    • 对于整个结构,可以做赋值、取地址,也可以
    传递给函数参数

    • p1 = (struct point){5, 10};
    // 相当于p1.x = 5;
    p1.y = 10;
    • p1 = p2;
    // 相当于p1.x = p2.x; p1.y = p2.y;

    复合字面量
    • today = (struct date) {9,25,2004};

    • today = (struct date) {.month=9, .day=25,year=2004};

    六.结构指针

    • 和数组不同,结构变量的名字并不是结构变量的地址,必须使用&运算符

    • struct date *pDate = &today;

    #include <stdio.h>
    
    struct date {
        int month;
         int day;
         int year;
    }; 
    
    int main(int argc, char const *argv[])
    {
        struct date today;
        
        today = (struct date){9,10,2019};
        
        struct date day;
        
        day =today; 
        
        struct date *pDate = &today;
        
        printf("Today's date is %i-%i-%i.
    ",
            today.year,today.month,today.day);
        
        printf("The day's date is %i-%i-%i.
    ",
            day.year,day.month,day.day);
        
        printf("address of today is %p
    ",pDate);
        
        return 0;
    }

    七.结构与函数

    1.结构作为函数

    • 整个结构可以作为参数的值传入函数
    • 这时候是在函数内新建一个结构变量,并复制调用者的结构的值

    • 也可以返回⼀个结构
    • 这与数组完全不同

     2.输入结构

    • 没有直接的方式可以一次scanf一个结构

    • 如果我们打算写一个函数来读入结构

    • ->
    • 但是读入的结构如何送回来呢?
    • 记住C在函数调用时是传值的
    • 所以函数中的p与main中的y是不同的

    • 在函数读入了p的数值之后,没有任何东西回到main,所以y还是 {0, 0}

    #include <stdio.h>
    
    struct point {
    int x;
    int y; };
    
    void getStruct(struct point);
    void output(struct point);
    void main( ) {
    struct point y = {0, 0};
    getStruct(y);
    output(y); }
    
    void getStruct(struct point p) {
    scanf("%d", &p.x);
    scanf("%d", &p.y);
    printf("%d,%d
    ", p.x, p.y); }
    
    void output(struct point p) {
    printf("%d, %d", p.x, p.y); 
    }

    3 解决的方案

    • 之前的方案,把一个结构传入了函数,然后在函数中操作,但是没有返回回去

    • 问题在于传入函数的是外面那个结构的克隆体,而不是指

    • 传入结构和传入数组是不同的
    • 在这个输入函数中,完全可以创建一个临时的结构变量,
    然后把这个结构返回给调用者

    也可以把y的地址传给函数,函数的参数类型是指向一个结构的指针。不过那样的话,访问结构的成员的方式需要做出调整。

    4.结构指针作为参数

    5.指向结构的指针

    用->表示指针所指的结构变量中的成员

    6.结构指针参数

     

    #include <stdio.h>
    
    struct point {
        int x;
        int y;
    };
    
    struct point* getStruct(struct point*);
    void output(struct point);
    void print(const struct point *p);
    
    int main(int argc,char const *argv[])
    {
        struct point y = {0,0};
        getStruct(&y);
        output(y);
        output(*getStruct(&y));
        print(getStruct(&y));
    }
    
    struct point* getStruct(struct point *p)
    {
        scanf("%d",&p->x);
        scanf("%d",&p->y);
        printf("%d,%d
    ",p->x,p->y);
        return p;
    }
    
    void output(struct point p)
    {
        printf("%d,%d
    ",p.x,p.y);
    }
    
    void print(const struct point *p)
    {
        printf("%d,%d",p->x,p->y);
    }

    • 好处是传入传出只是一个指针的大小
    • 如果需要保护传入的结构不被函数修改
    • const struct point *p
    • 返回传入的指针是一种套路

    7.结构中的结构

    结构数组:

    struct date dates[100];
    struct date dates[] = {
    {4,5,2005},{2,4,2005}};

     struct dateAndTime {
    struct date sdate;
    struct time stime;
    };

    嵌套的结构

     8.结构中的结构的数组

    #include <stdio.h>
    
    struct point{
    int x;
    int y;
    };
    
    struct rectangle {
    struct point p1;
    struct point p2;
    };
    
    void printRect(struct rectangle r)
    {
    printf("<%d, %d> to <%d, %d>
    ", r.p1.x, r.p1.y, r.p2.x, r.p2.y);
    }
    
    int main(int argc, char const *argv[])
    {
    int i;
    struct rectangle rects[ ] = {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}}; // 2 rectangles
    for(i=0;i<2;i++) printRect(rects[i]);
    }

  • 相关阅读:
    LeetCode Related Info
    LeetCode Climbing Stairs
    Linux命令语句秘籍
    Java基础学习 —— io
    Jquery的入门学习
    Java基础学习 —— bat处理文件
    Java基础学习 —— 线程
    Java基础学习——泛型
    java基础学习——集合
    两个div叠加触发事件发生闪烁问题
  • 原文地址:https://www.cnblogs.com/guoweilf/p/11497646.html
Copyright © 2011-2022 走看看