C程序结构

C 基础 - 图1

  • )c语言程序由函数构成,每个函数可以实现一个或多个功能;

  • )一个正规程序可以有多个函数,但是有且只有一个主函数;

  • )函数只有在被调用的时候才执行,主函数由系统调用执行;

  • )函数的格式必须按照规范书写;

  • )C语言程序文件的后缀为.c;

关键字

C 基础 - 图2
C 基础 - 图3

C中的变量声明

变量的声明有两种情况:

  • 一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。

  • 另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。除非有extern关键字,否则都是变量的定义。

定义字面量

在C中,有两个简单的定义字面量的方式:

  • 使用#define预处理器;

  • 使用const关键字;

二者的区别:
#define是宏定义,它不能定义常量,但宏定义可以实现在字面意义上和其他定义常量相同的功能。本质的区别就在于#define不为宏名分配内存,而const也不为常量分配内存,怎么回事呢,其实const并不是去定义一个常量,而是去改变一个变量的存储类,把该变量所占的内存变为只读。

C 存储类

auto存储类

auto 存储类是所有局部变量默认的存储类。

register 存储类

register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 ‘&’ 运算符(因为它没有内存位置)。

寄存器只用于需要快速访问的变量,比如计数器。还应注意的是,定义 ‘register’ 并不意味着变量将被存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制。

static 存储类

static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。
static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。
static 是全局变量的默认存储类。

extern 存储类

extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 ‘extern’ 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解,extern 是用来在另一个文件中声明一个全局变量或函数。
extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候。

异或

利用异或^来交互两个数的值,而且不引入其他的变量。

  1. #include<stdio.h>
  2. int main( )
  3. {
  4. unsigned int a=60; //0011 1100
  5. unsigned int b=13; //0000 1101
  6. printf("a=%d,b=%d",a,b); //输出a,b的值
  7. printf("\n");
  8. a=a^b; //a=a^b=0011 0001
  9. b=a^b; //b=a^b=0011 1100
  10. a=a^b; //a=a^b=0000 1101
  11. printf("a=%d,b=%d",a,b); //输出a,b的值
  12. }

初始化局部变量和全局变量

  1. 当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动对其初始化,如下所示:<br />![](https://cdn.nlark.com/yuque/0/2018/png/200878/1545485869144-9833d4c8-cf94-4a09-b90a-82476ed4651c.png#width=692)<br /> 正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果,因为未初始化的变量会导致一些在内存位置中已经可用的垃圾值。

函数指针

函数指针是指向函数的指针变量。
函数指针可以象一般函数一样,用于调用函数、传递参数;

函数指针变量的声明:

  1. typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的函数指针类型

实例:

  1. #include <stdio.h>
  2. int max(int x, int y)
  3. {
  4. return x > y ? x : y;
  5. }
  6. int main(void)
  7. {
  8. /* p 是函数指针 */
  9. int (* p)(int, int) = & max; // &可以省略
  10. int a, b, c, d;
  11. printf("请输入三个数字:");
  12. scanf("%d %d %d", & a, & b, & c);
  13. /* 与直接调用函数等价,d = max(max(a, b), c) */
  14. d = p(p(a, b), c);
  15. printf("最大的数字是: %d\n", d);
  16. return 0;
  17. }

回调函数

  1. 回调函数是通过函数指针调用的函数,即是有别的函数执行时调用你实现的函数。

C 基础 - 图4