您的位置:首页 > 运维架构 > Linux

4000 LinuxC编程预习 - 预处理与结构体

2017-10-26 21:45 281 查看
1. 条件编译:(按照不同的条件去编译不同的程序部分)

格式1:#ifdef 标识符

程序段1

#else

程序段2

#endfif

如果标识符被定义了就执行程序段1,否则执行程序段2

格式2:#ifndef 标识符

程序段1

#else

程序段2

#endfif

如果标识符未被定义了就执行程序段1,否则执行程序段2

格式3:#if 常量表达式

程序段1

#else

程序段2

#endfif

如果常量表达式的值非0,则执行程序段1,否则执行程序段2

2.什么是结构体

结构体是一种专门设计用来存储不同数据类型元素集合

结构体与数组的对比:

1)都由多个元素组成

2)各个元素在内存中的存储空间是连续的

3) 数组只能由多个相同类型的数据构成, 结构体可以由多个不同类型的数据构成。

3.结构体的定义方法

 结构体内部的元素,也就是组成成分,我们一般称为"成员"。

结构体的一般定义形式为:

 

  struct 结构体名{

      

     类型名1 成员名1;

     

     类型名2 成员名2;

     

     ……

     类型名n 成员名n;   

 };

 struct是关键字,是结构体类型的标志。

例如,定义一个Car

struct Car {

    int wheels; // 轮子数

    int speed; // 速度

};

定义结构体变量:

struct Car {

    int wheels; // 轮子数

    int speed; // 速度

}car;//直接定义变量

//单独定义结构体变量

struct Car car

4.结构体初始化与使用

初始化:

struct Car {

    int wheels; // 轮子数

    int speed; // 速度

}car;

car = {4,250};

//使用:

printf("%d",car.wheels);

5.结构体注意点

结构体类型的作用域

 1> 定义在函数外面:全局有效(从定义类型的那行开始,一直到文件结尾)

 2> 定义在函数(代码块)内部:局部有效(从定义类型的那行开始,一直到代码块结束)

不允许对结构体进行自身递归定义。

结构体内可以包含别的结构体。
只有在定义结构体变量时才会进行内存空间分配。

6.结构体数组的定义方式

1)struct Student {

    char *name;

    int age;

};

struct Student stu[5]; //定义1

 

2)struct Student {

    char *name;

    int age;

} stu[5]; //定义2

 

3)struct {

    char *name;

    int age;

} stu[5]; //定义3

上面3种方式,都是定义了一个变量名为stu的结构体数组,数组元素个数是5。

初始化:

struct {

    char *name;

    int age;

} stu[2] = { {"MJ", 27}, {"JJ", 30} };

也可以用数组下标访问每一个结构体元素,跟普通数组的用法是一样的。

7.结构体与函数

 

如果结构体作为函数参数,只是将实参结构体所有成员的值对应地赋值给了形参结构体的所有成员

 修改函数内部结构体的成员不会影响外面的实参结构体

 

8.枚举

用来为某变量定义固定值。

格式:

一般形式为:enum 枚举名 {枚举元素1,枚举元素2,……};

enum Season {spring, summer, autumn, winter}; 

// 定义枚举变量

enum Season s;

//基本操作

s = spring; // 等价于 s = 0;

s = 3; // 等价于 s = winter;

9.枚举使用的注意事项:

1)C语言编译器会将枚举元素(spring、summer等)作为整型常量处理,称为枚举常量。

2)枚举元素的值取决于定义时各枚举元素排列的先后顺序。默认情况下,第一个枚举元素的值为0,第二个为1,依次顺序加1。

enum Season {spring, summer, autumn, winter};

也就是说spring的值为0,summer的值为1,autumn的值为2,winter的值为3

3)也可以在定义枚举类型时改变枚举元素的值

enum season {spring, summer=3, autumn, winter};

没有指定值的枚举元素,其值为前一元素加1。也就说spring的值为0,summer的值为3,autumn的值为4,winter的值为5

10.预处理

代码编译前对特殊的指令做解释。

以#开头,结尾不用分号。

 

1.宏定义

代码编译前对特殊的指令做解释。

以#开头,结尾不用分号。

> 不带参数的宏定义

define 宏名 字符串

 比如#define ABC 10

> 带参数的宏定义

#define 宏名(参数列表) 字符串

例如:

 

[cpp] view plain copy print?

 #define average(a, b) (a+b)/2  

   

 int main ()  

 {  

    int a = average(10, 4);  

      

    printf("平均值:%d", a);  

    return 0;  

}  

 

与函数的对比:

1> 宏定义不涉及存储空间的分配、参数类型匹配、参数传递、返回值问题。

2> 函数调用在程序运行时执行,而宏替换只在编译预处理阶段进行。所以带参数的宏比函数具有更高的执行效率。

 

2.条件编译

规定特定代码只在满足一定条件的时候才进行编译。

格式:

 #if 条件1

  ...code1...

 #elif 条件2

  ...code2...

 #else

  ...code3...

 #endif

例如:

#include <stdio.h> 

  #define MAX 1

  int main ()

  {

  #if MAX == 0

      printf("MAX是0");

  #elif MAX > 0

     printf("MAX大于0");

 #else

     printf("MAX小于0");

 #endif

     return 0;

 }

实际参与编译的代码为:

#include <stdio.h> 

 int main ()

 {

     printf("MAX大于0");

 }

 

一定写#endif,否则丢失一个大括号

其他用法:

//如果定义了 和 如果没有定义

#if defined()和#if !defined()

#ifdef和#ifndef

 

3.文件包含

两种形式:

#include <文件名>

#include "文件名"

文件包含不允许递归包含。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: