首页 > 其他分享 >C语言 笔记2

C语言 笔记2

时间:2023-08-20 16:36:08浏览次数:39  
标签:info struct int 笔记 C语言 枚举 test 结构

枚举

常量符号化

我们可以用下面代码将常量符号化

const int red = 0;
const int yellow = 1;
const int blue = 2;

用枚举可以简写成

enum = colors {red,yellow,blue};

此时,red => 0 ,yellow => 1 ,blue => 2

枚举

  • 枚举是一种用户定义的数据类型,他用关键词enum以如下语法来声明:
enum 枚举类型的名字 {名字0,名字1,名字2...};
  • 枚举类型名字通常并不真的使⽤,要⽤的是在⼤括号⾥的名字,
    因为它们就是就是常量符号,它们的类型是int,值则依次从0
    到n。如:
enum colors {red,yellow,blue};
  • 枚举量可以作为值
  • 枚举类型可以跟上enum作为类型
  • 但是实际上是以整数来做内部计算 和外部输⼊输出的

自动计数的枚举

enum colors {red,yellow,blue,num};

此时num=3,可以用于计数

枚举量

enum colors {red=0,yellow=5,blue=8};

声明枚举量时可以指定值

  • 枚举类型可以当作类型使⽤,但是实际上 很(bu)少(hao)⽤
  • 如果有意义上排⽐的名字,⽤枚举⽐const int⽅ 便
  • 枚举⽐宏(macro)好,因为枚举有int类型

结构类型

声明结构类型

声明形式

struct <结构名称>{
    数据类型 成员名称;
    数据类型 成员名称;
	数据类型 成员名称;
} <变量名>;
    
eg: 
struct date{
    int year;
    int month
    int day;
} today;

eg:
struct date{
    int year;
    int month
    int day;
};
struct date today;

声明位置

  • 声明在函数内部,只能在函数内部使用
  • 声明在函数外部,可以被多个函数使用

结构的初始化

struct date{
    int year;
    int month
    int day;
};

struct date today = {2022,10,5};
struct date yesterday = {.month = 10,.day = 4}

结构的使用

  • 结构和数组有点像
  • 数组用 [] 访问其成员,结构用 . 来访问其成员
struct date{
    int year;
    int month
    int day;
};

struct date today = {2022,10,5};
printf("Today is %d/%d/%d\n",today.year,today.month,today.day);

结构运算

  • 要访问整个结构,直接使用结构变量的名字
  • 对于整个结构,可以赋值,取地址,也可以传递参数给函数
    • day1 = (struct date){2022,10,5};
    • day2 = day1;

结构指针

  • 和数组不同,结构变量的名字并不是结构变量的地址,需要使用&运算符
    • struct date *pDate = &today;

结构与函数

结构作为函数参数

函数类型 函数名(struct 结构名 变量名,...){}
  • 结构的值可以直接作为参数传入

  • 此时是在函数内新建了一个结构,并复制传入的值

  • 传入函数的结构在函数中只在值上等于原结构

  • 函数可以return一个结构

函数可以返回一个结构

struct 结构名 函数名(...){
	struct 结构名 变量名;
	return 变量名;
}

举个例子

#include<stdio.h>
struct info getInfo(void);

struct info {
    char name[5];
    int age;
    int id;
};

int main(){
    struct info student;
    student = getInfo();
    printf("姓名\t年龄\t学号\n%s\t%d\t%d\n",\
            student.name,student.age,student.id);
    return 0;
}

struct info getInfo(void){
    struct info t;
    scanf("%s%d%d",t.name,&t.age,&t.id);
    return t;
}

在这个例子中,getInfo返回了一个结构,并赋给了student变量.

结构指针作为参数

  • 相对于上面的方法,结构指针作为参数更推荐使用.

K & R

"If a large structure is to be passwd to a func, it's generally more efficent to pass a pointer than to copy whe whole structure"

  • 对于一个函数指针,可以用 -> 运算符访问指针所指结构下的成员.

因此,我们可以把上一个的例子修改为:

#include<stdio.h>
struct info* getInfo(struct info *t);
void printInfo(struct info *t);

struct info {
    char name[5];
    int age;
    int id;
};

int main(){
    struct info student;
    printInfo(getInfo(&student));
    return 0;
}

struct info* getInfo(struct info *t){
    scanf("%s%d%d",t->name,&t->age,&t->id);
    return t;
}

void printInfo(struct info *t){
    printf("姓名\t年龄\t学号\n%s\t%d\t%d\n",\
            t->name,t->age,t->id);
}

结构中的结构

结构数组

  • 结构数组的声明与访问和其他数组相似.

  • 结构数组中每个成员都是一个结构.

  • 使用 变量名[下标].成员名 来访问结构数组中结构的成员.

struct info {
    char[5] name;
    int age;
    int id;
}

struct info StudentList[3] = {
    {"张三",18,20221001}
    {"李四",18,20221002}
    {"王麻子",19,20221003}
}

printf("%s%d%d",StudentList[0].name,StudentList[0].age,StudentList[0].id);

结构中的结构

结构的成员也可以是一个变量

声明方法

struct sa {
    int i;
    ...
}

struct sb {
    struct sa a;
    ...
}

struct sb test{{1,...},...};

访问方法

printf("%d\n",test.a.i);

注意事项

如果有一个结构指针,可以使用 -> 来访问其成员。但成员如果是结构,访问结构成员的成员就不能用用 -> 了,因为 -> 是操作指针的运算符,不能操作结构变量.

struct sb *ptest = &test;
[√] ptest->a
[×] ptest->a->i
[√] ptest->a.i

结构中的结构的数组

标签:info,struct,int,笔记,C语言,枚举,test,结构
From: https://www.cnblogs.com/orzmiku/p/17644188.html

相关文章

  • C语言 笔记4
    全局变量定义在函数外部的变量是全局变量。全局变量具有全局的生存期和作用域全局变量与任何函数都无关在任何函数内部都可以使用全局变量不能使用变量给全局变量初始化不初始化的全局变量默认为NULL函数内的同名变量会隐藏全局变量inta=1;{ inta=2; { in......
  • C语言 笔记3
    可变数组设计一个Array库,提供数组初始化,数组数据查看和修改的功能,且数组大小可变。array.h/*可变数组*///array_block,每次触发自动增长时增长的数量,记作一个array_block#defineARRAY_BLOCK10typedefstruct{intsize;int*array;}Array;Arrayarr......
  • C语言 笔记5
    格式化输入输出输入-printfprintf("%[flags][width][.prec][hlL]type...",参数表...);返回值输出的字符数flagFlag含义-左对齐+给一个正数强制加一个+号(space)正数留空0左边补零,不能和左对齐同时使用width和precwidth含义number......
  • 「Python」第一阶段第七章笔记
    函数的多返回值"""函数的多返回值"""defmy_return():return1,2x,y=my_return()print(x,y,type(x),type(y))函数的多种传参方式"""函数的多种传参方式-位置-参数-缺省-不定长"""#位置传参形参实参位置对应defadd(a=0,b=0)......
  • 「Python」第一阶段第五章笔记
    函数的初体验"""函数的初体验"""name="OrzMiku"print(f"{name}这个名字有{len(name)}个字符长")函数的定义"""函数的定义def函数名(参数表):函数体return返回值"""defsayHello():print("HelloW......
  • 「Python」第一阶段第二章 笔记
    字面量#字面量:写在程序中固定的值print(114514)print(1919810)print("HelloWorld")注释"""Python中的多行注释"""print("多行注释用三个引号开头三个引号结尾")#Python中的单行注释print("单行注释以井号开头")变量"""变量名=变量值&......
  • 「Python」第一阶段第三章笔记
    布尔类型和比较运算符"""跳过"""if语句基本格式"""if语句基本格式if条件:代码块"""age=int(input("请输入你的年龄:"))ifage>=18:print("老东西速速爆金币!")quit()print("小东西给我磕一个!")......
  • 「Python」第一阶段第四章笔记
    while循环"""while条件:代码块"""num=255;#python没有++和--whilenum:print(num)num-=1for循环for基础语法"""for循环(感觉更像是一个foreach循环)for临时变量in序列类型:代码块"""name="OrzMiku......
  • 「Python」第二阶段第一章笔记
    初识对象"""初识对象"""#1.设计一个类classStu:name=None#学生姓名gender=None#学生性别nationality=None#学生国籍native_place=None#学生籍贯age=None#学生年龄#2.创建一个对象stu_1=Stu()#3.对象属性进行赋......
  • 计算机萌新的成长历程——初识C语言2
    今天我将分享初识数据类型的学习体会和心得。刚刚开始接触数据类型,我学习到了以下几个数据类型char——字符数据类型short——短整型int——整型long——长整型longlong——更长的整型float——单精度浮点数double——双精度浮点数下面我将分享一下我对这些数据类型的理解。理解这......