c语言机构体,枚举,宏

结构体:

结构体初始化顺序:

先定义结构体,后初始化

定义结构体时同时初始化

匿名自定义初始化结构体

计算结构体在内存中的内存占用的字节数:

先找对齐模数,是结构体中的基本数据类型占用字节数最大的那个

如果剩下的可以存的下则存,如果存不下则重新分配

如果局部结构体和全局结构体重名则覆盖全局结构体

结构体指针:

struct s{

int lunxi;

int speed;

}car1;

struct s *p = NULL;

p = &car1;

struct Student stu1 = {18, "张三丰"};

struct Stucent *p = &stu1;

两种方法:

1) (*p).age   访问年龄

(*p).name  访问姓名

2) p->age

p->name

printf("%s%d", (*p).name, (*p).age);

printf("%s%d", p->name, p->age);

结构体嵌套:结构体定义的里面有其他结构体

结构体不可以嵌套自己变量,可以嵌套指向自己这种类型的指针

例:

struct Date{

int year;

int month;

int day;

}

struct Student{

char *name;

int age;

float score;

struct Date birthday;

//struct Student stu; 错误的

struct Student *stu;  正确的

};

struct Student stu1 = {"张三丰", 28, 59.99f, {1200, 12, 12}};

printf("姓名:%s, 年龄:%d(生日:%d-%02d-%02d), 成绩:%.2f\n",

stu1.name, stu1.age, stu1.birthday.year, stu1.birthday.month, stu1.birthday.day, stu1.score);

struct Person{

char *naem;

int age;

struct Person *child;

};

struct Person kim = {"kim", 8, NULL};

struct Person p1  = {"林志颖", 38, &kim};

printf("%s的儿子是:%s, 儿子的年龄:%d\n", p1.name, (*p.child).age, p1.childj->name);

用结构体变量做为函数的形参,结构体属性是改不掉的,实际上还是值传递

结构体指针作为函数形参

例:

void xiuche2(struct Car *c1){

c1->lunzi = 2;

}

struct Cat car1 = {4, 200};

xiuche2(&car1);

printf("%d\n", car.lunzi);

7)枚举类型:

枚举类型定义:

enum iColor {

white, black, blue

}

enum iColor iPhoneColor

enum Sex{Man, Women, Yao} sex; sex取值为 Man, Women, Yao 中的一个

枚举变量定义完成后,系统会自动给枚举的每个元素赋值一个整形的初值,从第一个元素0开始,每个元素加1。//Man = 0; Women = 1; Yao = 2;

也可以手动赋初值,后面元素自动加一

8)typedef:

typedef int ARRAY[5]; //int a[5];数组长度是5

ARRAY a1, b1;  // int a1[5], b1[5]

int sum(int a, int b){

return a+b;

}

int jian(int a, int b){

return a-b;

}

int (*p)(int, int);

typedef int (*FUN)(int, int); //FUN是一个别名

FUN f1, f2;

f1 = sum;

f2 = jian;

printf("%d\n", f1(67, 23));

9)宏:

宏的分类:

1)无参宏  #define M 10

2)有参宏  #define SUM(a) a+a

int relult = SUM(3); //result = 6;

#define M1(x, y) x*y+x+y

result = M1(4, 5); //result = 29;

#define M3(x, y) x = a(a = 2) + 2; y = 4 * 3;

#dfine MAX(a, b) (a > b) ? a : b

int n = MAX(43, 888);

#define 和 typedef 的区别//宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,他不是简单的代换而是对类型说明符重新命名。被命名打标识符具有类型定义说明的功能

#define INT int*

typedef int* INT1

INT a, b; //a是指针变量, b是普通变量

INT1 a1, b1; //a1是指针变量, b1是指针变量

以#开头的指令都是预处理指令

在编译程序预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去替换,字符串中的宏不会替换

#undef M  //取消宏定义

宏定义可以嵌套

例:

#define R 4

#define PI 3.14

#define AREA PI*R*R

可以用宏定义表示数据类型,式书写方便

例:

#define P1 printf

#define P2 "%d\n"

#define INT int

#define P struct Person

P{

int age;

char *name;

}

10)条件编译:

#if--#elif--#else--#endif

#ifdef DEBUG1  //如果EDBUG1已定义,则a = 0,否则 a = 10000

a = 0;      //#ifdef 检查宏是否定义 DEBUG是系统已定义宏

#else          //#ifndef 如果没有定义宏

a = 10000;

#endif

if(score < 60) printf("E\n");

else if(score <= 69) printf("D\n");

else if(score <= 79) printf("C\n");

else if(score <= 89) printf("B\n");

else if(score <= 100) printf("A\n");

#if score <= 60

printf("E\n");

#elif score <= 69

printf("D\n");

#elif score <= 79

printf("C\n");

#elif score <= 89

printf("B\n");

#elif score <= 100

printf("A\n");

#endif

#define DEBUG = 1 //只需把1改成0将不显示调试信息

#if DEBUG ==1 //显示调试信息

#define log(format, ...) printf(format, ##__VA_ARGS__) //...表示可变参数个数,

//## 表示可以有参数也可无

#else //不显示调试信息

#define Log(format, ...)

#endif

条件编译发生在预处理阶段,在编译之前做的事情

核心:根据条件编译指定的代码

条件不同,编译的部分也不同,生成的目标文件(.o)的大小也不同

注释不参与编译

时间: 2024-08-10 21:29:33

c语言机构体,枚举,宏的相关文章

C语言--&gt;(十四)结构体、宏、编译

知识点: 1.结构体 struct 2.typedef关键字 3.宏的定义 4.宏与函数的区别 5.文件包含和多文件编译 6.条件编译 ===========================结构体 思考:如果现在希望保存一个学生的信息,姓名,身高,年龄,地址,该如何保存 char name[64]; float height; int age; char addr[64]; 1.什么是结构体 struct 结构体指的是一种数据结构,是c语言中复合数据类型的一 种多种不同数据类型的集合 2.结构体

不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 共用体 枚举 类型定义符 示例cStruct.h #ifndef _MYHEAD_STRUCT_ #define _MYHEAD_STRUCT_ #ifdef __cplusplus extern "C" #endif char *demo_cStruct(); #endif cStruct.c /* * 结构体,共用体,枚举,类型定义符 * * 注:结构体变量在做参数传递时,其内每个

漫谈C语言结构体struct、公用体union空间占用

先用代码说话: #include<stdio.h> union union_data0{ int a ;//本身占用4个字节 char b ;//本身占用1个字节 int c ; }; union union_data1{ short a;//本身占用2个字节 char b[13];//本身占用13个字节 int c ;//本身占用4个字节 }; struct struct_data{ int a ;//int本身占用4个字节,偏移量为0 char b ;//char本身占用1个字节,偏移量为

解析C语言结构体对齐(内存对齐问题)

C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢? 开始学的时候,也被此类问题困扰很久.其实相关的文章很多,感觉说清楚的不多.结构体到底怎样对齐? 有人给对齐原则做过总结,具体在哪里看到现在已记不起来,这里引用一下前人的经验(在没有#pragma pack宏的情况下): 原则1.数据成员对齐规则:结构(struct或

一起talk C栗子吧(第一百二十四回:C语言实例--内置宏)

各位看官们,大家好,上一回中咱们说的是显示变量和函数地址的样例,这一回咱们说的样例是:内置宏.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在编译程序的时候,假设有语法错误,编译器就会提示,在某个文件的某一行有错误,这是怎么做到的呢?事实上是使用了C语言的内置宏. 说到宏,我想大家都知道,而所谓的内置宏相似于C语言的关键字,它是C语言自定义的,因此我们不须要定义宏,就能够直接使用.经常使用的内置宏有"_LINE_"和"_FILE_".假设把它们放到

C语言 结构体指针赋值 incompatible types when assigning to type &#39;char[20]&#39; from type &#39;char *&#39;

strcpy(pstudent->name, "guo zhao wei "); 为什么错误,该怎么写,(红色行) 追问 为什么不能直接赋值啊, 追答 用char nnnn[20]定义的,用strcpy 用char *ppp定义的,用=来赋值 C语言 结构体指针赋值 incompatible types when assigning to type 'char[20]' from type 'char *'

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用 传值 把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 传地址 传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象 传引用 真正的以地址的方式传递参数 传递以后,行参和实参都是同一个对象,只是他们名字不同而已 对行参的修改将影响实参的值 所谓变量是内存地址的一个抽象名字,在静态编译的程序中,所有变量名都会在编译时转换成内存地址,机器不知道变量名,只知道地址. C 语

C语言结构体(struct)常见使用方法(转)

本文转自 CSDN huqinweI987 基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量. 结构体定义: 第一种:只有结构体定义 [cpp] view plaincopy struct stuff{ char job[20]; int age; float height; }; 第二种:附加该结构体类型的“结构体变量”的初始化的结构体定义 [cpp] view plaincopy

关于C语言中的一些宏的小知识

关于C语言中的一些宏的小知识 1.##和# c语言中,##表示把两个宏参数贴合在一起,即,#define call(x,y) x##y ,执行call(x,y)结果为xy,例如,int x=2,y=5;int xy=90;printf("%d\n",call(x,y));//结果为90 ##被称为连接符,用来将两个宏参数连接为一个宏参数.而单个#的功能是将其后面的宏参数进行字符串化操作,简单地说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号,使其成为字符串. 以上引自百度知