• C语言入门-结构类型


    一、声明结构类型

    #include <stdio.h>
    
    
    int main(int argc, char const *argv[])
    {
    	// 声明结构类型
    	struct date
    	{
    		int month;
    		int day;
    		int year;
    	};
    	
        // 使用自定义的类型
    	struct date today;
    
    	today.month = 9;
    	today.day = 30;
    	today.year = 2019;
    
    	printf("Today is date is %i-%i-%i
    ", today.year , today.month, today.day);
    
    
    	return 0;
    }
    

    二、在函数内/外 ?

    1. 和本地变量一样,在函数内部声明的结构类型只能在函数内部使用
    2. 所以通常在函数外部声明结果类型,这样就可以被多个函数使用了
    #include <stdio.h>
    
    struct date
    	{
    		int month;
    		int day;
    		int year;
    	};
    
    int main(int argc, char const *argv[])
    {
    	
    	struct date today;
    
    	today.month = 9;
    	today.day = 30;
    	today.year = 2019;
    
    	printf("Today is date is %i-%i-%i
    ", today.year , today.month, today.day);
    
    	return 0;
    }
    

    三、声明结构的形式

    struct point{
        int x;
        int y;
    }
    
    struct point p1,p2;
    
    // 其中p1和p2都是point
    // 里面有x和y的值
    

    还有另外一种形式:

    struct{
        int x;
        int y
    }p1 , p2 ;
    // p1和p2都是一种无名结构,里面有x和y
    

    当然了,还有一种更加常用的形式

    struct point {
        int x;
        int y;
    }p1 , p2;
    

    p1和p2都是point,里面有x和y的值

    四、结构的初始化

    struct date{
    	int month;
    	int day;
    	int year;
    };
    
    int main(int argc, char const *argv[])
    {
    	struct date taday = {9 , 30 , 2019};
    	struct date thismonth = {.month=9 , .year=2019};
    
    	printf("Today is date is %i-%i-%i
    ", taday.year,taday.month,taday.day );
    	printf("This month is %i-%i-%i
    ", thismonth.year,thismonth.month,thismonth.day);
    
    	return 0;
    }
    // Today is date is 2019-9-30
    // This month is 2019-9-0
    
    

    结构成员

    1. 结构和数组有点像
    2. 数组用[]运算符和下标访问其成员 a[10] = 10;
    3. 结构用“ . " 运算符和名字访问其成员 today.day , student.firstName

    结构运算

    1. 要访问整个结构,直接用结构变量的名字
    2. 对于整个结构,可以做赋值、取地址、也可以传递给函数参数
    3. p1 = (struct point) {5,10} ; 等于 p1.x = 5 , p1.y = 10;
    4. p1 = p2 ; 等于 p1.x = p2.x ; p1.y = p2.y;

    结构指针

    1. 和数组不同,结构变量的名字并不是结构变量的地址,必须使用&运算符
    2. struct date *pDate = &today;

    五、结构与函数

    结构作为函数参数

    int numberOfDays(struct date d);
    
    1. 整个结构可以作为参数的值传入函数
    2. 这时候是在函数内新建一个结构变量,并复制调用者的结构的值
    3. 也可以返回一个结构
    4. 这与数组完全不同

    输入结构

    1. 没有直接的方式可以一次scanf一个结构
    2. 如果我们打算写一个函数来读入结果
    #include <stdio.h>
    
    struct point
    {
    	int x;
    	int y;
    };
    
    void getStruct(struct point p);
    void output(struct  point p);
    
    int main()
    {
    	struct point y = {0,0};
    	getStruct(y);
    	output(y);
    	
    	return 0;
    }
    
    
    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);	
    }
    
    
    // 2
    // 3
    // 2 , 3
    // 0 , 0
    
    1. 但是读入的结构如何送回来呢?
    2. 记住c语言函数在调用时是传值的,所以函数中的p与main中的y是不同的

    解决的方案

    1. 之前的方案,把一个结构传入函数,然后在函数中操作,但是没有返回回去
      • 问题在于传入函数的是外面那个结构体的克隆体,而不是指针
      • 传入结构和传入数组是不同的
    2. 在这个输入函数中,完全可以创建一个临时的结构变量,然后把这个结构返回给调用者,但这并不常用,了解即可
    #include <stdio.h>
    
    struct point
    {
    	int x;
    	int y;
    	
    };
    
    struct point getStruct(void);
    void output(struct  point p);
    
    int main()
    {
    	struct point y = {0,0};
    	y = getStruct();
    	output(y);
    	
    	return 0;
    }
    
    
    // 这里返回一个struct
    struct point getStruct(void){
    
    	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);	
    }
    
    // 5 6
    // 5 , 6
    // 5 , 6
    
    1. 最常用的就是结构指针作为参数

    六、指向结构的指针

    struct date
    {
    	int month;
    	int day;
    	int year;
    }myday;
    
    struct date *p = &myday;
    
    (*p).month = 12;
    p->month = 12;
    

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

    结构指针参数

    
    struct point
    {
    	int x;
    	int y;
    	
    };
    
    
    struct point* getStruct(struct point *p);
    void output(struct point p);
    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));
    
    	return 0;
    }
    
    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);
    }
    
    
    
  • 相关阅读:
    【STM32H7】第3章 ThreadX GUIX和GUIX Studio介绍
    【STM32F429】第3章 ThreadX GUIX和GUIX Studio介绍
    Spring Boot Devtools 依赖详解
    《深入理解 Java 虚拟机》-- 读书笔记
    JAVA连接MySQ报错:Caused by: javax.net.ssl.SSLException: Received fatal alert: protocol_version
    JAVA生成文件的md5校验值
    IDEA启动报错:Error:java: Compilation failed: internal java compiler error
    JAVA读取本地html文件里的html文本
    SpringBoot打包实现静态文件、配置文件、jar包分离
    SpringBoot中Post请求提交富文本数据量过大参数无法获取的问题
  • 原文地址:https://www.cnblogs.com/mengd/p/11700158.html
Copyright © 2020-2023  润新知