C语言基本知识点

太久没写C,就容易忘,很容易和其他语言的语法混淆,故整理一篇C语言的基本知识点。

C程序结构

C 程序主要包括以下部分:

  • 预处理器指令
  • 函数
  • 变量
  • 语句 & 表达式
  • 注释
    以下是一个例子
#include <stdio.h>
int main()
{
   /* 我的第一个 C 程序 \*/
   return 0;
}

数据类型

整数类型

char 1 字节 -128 到 127 或 0 到 255
unsigned char 1 字节 0 到 255
signed char 1 字节 -128 到 127
int 2 或 4 字节 -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
unsigned int 2 或 4 字节 0 到 65,535 或 0 到 4,294,967,295
short 2 字节 -32,768 到 32,767
unsigned short 2 字节 0 到 65,535
long 4 字节 -2,147,483,648 到 2,147,483,647
unsigned long 4 字节 0 到 4,294,967,295

浮点类型

float 4 字节 1.2E-38 到 3.4E+38 6 位小数
double 8 字节 2.3E-308 到 1.7E+308 15 位小数
long double 16 字节 3.4E-4932 到 1.1E+4932 19 位小数

变量和常量

变量

int a;//声明,也是定义,是需要建立存储空间的
extern int a; //只是声明,不是定义。不需要建立存储空间的,说明变量a可以在别的文件中定义

常量

在 C 中,有两种简单的定义常量的方式:
使用 #define 预处理器。#define LENGTH 10
使用 const 关键字。const int LENGTH = 10;

左值和右值

C 中有两种类型的表达式:
左值(lvalue):指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。
右值(rvalue):术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。

C存储类

存储类定义 C 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。

  • auto,是所有局部变量默认的存储类。
  • register,储在寄存器中而不是 RAM 中的局部变量
  • static,指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。
  • extern,extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 ‘extern’ 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理,extern 是用来在另一个文件中声明一个全局变量或函数。extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候

运算符

  • 算术运算符,略
  • 关系运算符,与&&,或||,非!
  • 位运算符,&与,|或,~取反,^异或,>>右移
  • 赋值运算符,略
  • 杂项运算符,sizeof & 三元
  • 运算符优先级,略

条件语句

  • if else
  • switch
switch(表达式)
{
    case 常量表达式1:语句1;[break];
    case 常量表达式2:语句2;[break];
    ...
    default:语句n+1;[break];
}

循环语句

函数

  1. 函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。
  2. 函数声明一般写在.h文件中,然后在具体的.c文件中include该.h后定义函数
  3. 函数参数:传值调用,引用调用

作用域

任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。C 语言中有三个地方可以声明变量:

  1. 在函数或块内部的局部变量
    它们只能被该函数或该代码块内部的语句使用。局部变量在函数外部是不可知的。
  2. 在所有函数外部的全局变量
    全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。
    全局变量可以被任何函数访问。也就是说,全局变量在声明后整个程序中都是可用的。
  3. 在形式参数的函数参数定义中
    被当作该函数内的局部变量,它们会优先覆盖全局变量
    关于初始化局部变量和全局变量:当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动对其初始化

数组

  1. 声明数组:int arr[10];
  2. 初始化数组:可以在声明数组时进行初始化,int arr[4] = {1,2,3,4};或int arr[]={1,2,3,4};
  3. 初始化一个全0数组,int[4] = 0;
  4. 多维数组
  5. 传递数组给函数
  6. 从函数返回数组
  7. 指向数组的指针

字符串

在 C 语言中,字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。
char greeting[] = “Hello”;

C指针

  1. 声明 type *var-name;
  2. 赋值:type *var-name = &var-name2
  3. 在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯
  4. 指针数组:定义用来存储指针的数组。
int i, *ptr[MAX];
for ( i = 0; i < MAX; i++)
{
   ptr[i] = &var[i]; /* 赋值为整数的地址 */
}
  1. 指向指针的指针
  2. 传递指针给函数
#include <stdio.h>
#include <time.h>
 
void getSeconds(unsigned long *par);

int main ()
{
   unsigned long sec;


   getSeconds( &sec );

   /* 输出实际值 */
   printf("Number of seconds: %ld\n", sec );

   return 0;
}

void getSeconds(unsigned long *par)
{
   /* 获取当前的秒数 */
   *par = time( NULL );
   return;
}
  1. 从函数返回指针
#include <stdio.h>
#include <time.h>
#include <stdlib.h> 
 
/* 要生成和返回随机数的函数 */
int * getRandom( )
{
   static int  r[10];
   int i;
 
   /* 设置种子 */
   srand( (unsigned)time( NULL ) );
   for ( i = 0; i < 10; ++i)
   {
      r[i] = rand();
      printf("%d\n", r[i] );
   }
 
   return r;
}
 
/* 要调用上面定义函数的主函数 */
int main ()
{
   /* 一个指向整数的指针 */
   int *p;
   int i;
 
   p = getRandom();
   for ( i = 0; i < 10; i++ )
   {
       printf("*(p + [%d]) : %d\n", i, *(p + i) );
   }
 
   return 0;
}
  1. 函数指针
    函数指针是指向函数的指针变量。
    函数指针可以像一般函数一样,用于调用函数、传递参数。
    函数指针作为某个函数的参数
    函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。
    简单讲:回调函数是由别人的函数执行时调用你实现的函数。
    函数指针变量的声明:
    typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的函数指针类型
#include <stdio.h>
 
int max(int x, int y)
{
    return x > y ? x : y;
}
 
int main(void)
{
    /* p 是函数指针 */
    int (* p)(int, int) = & max; // &可以省略
    int a, b, c, d;
 
    printf("请输入三个数字:");
    scanf("%d %d %d", & a, & b, & c);
 
    /* 与直接调用函数等价,d = max(max(a, b), c) */
    d = p(p(a, b), c); 
 
    printf("最大的数字是: %d\n", d);
 
    return 0;
}

自定义数据类型

enum(枚举)

结构体

共用体

位域

注意事项

  1. 语句结尾有分号

C99与C11

待写。。。

猜你喜欢

转载自blog.csdn.net/JackComeOn/article/details/83089064