C笔记

虽说C语言学了好多年了,但是还是很多东西没有真正搞清楚啊。
define|typedef|static|const|数组&指针|多维数组

define宏定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
一般形式为:#define 标识符 字符串
例如:#define PI 3.14
在编译预处理时会将PI进行替换,并且只是简单地字符串替换!
作用域是当前文件。
* 方便程序修改
* 提高程序运行效率
#define A a+b
...
int a=2,b=3;
int c=A*A; // >>> c=a+b*a+b,此时c=11,而不是25;
printf("%d",c);
...
所以有时候可以加个括号
#define A (a+b)

typedef

1
2
3
4
5
用来给类型起个新名字
一般形式: typedef *** newname;
example: typedef int INT;
typedef long long ll;
* 会对***进行编译,把***当做一个整体,然后起一个新名字
1
2
3
4
5
6
#define INT1 int*
typedef int* INT2;
...
INT1 p1,p2; // >>> int *p1,p2; //创建一个指针int型指针p1和int变量p2.
INT2 p3,p4; // >>> int *p3; int*p4; //创建两个int型指针变量
...

还可以用来定义机器无关的类型

1
2
3
4
5
6
你可以定义一个叫 REAL 的浮点类型,在目标机器上它可以获得最高的精度:
typedef long double REAL;
在不支持 long double 的机器上,该 typedef 看起来会是下面这样:
typedef double REAL;
并且,在连 double 都不支持的机器上,该 typedef 看起来会是这样:
typedef float REAL;

static

  • 修饰局部变量时,称为静态变量。

    1
    2
    可以提高局部变量的持久性,函数调用结束时,该变量并不会释放,第二次调用函数时,值还是之前的。
    会在静态数据区创建,初始值为0.
  • 修饰函数,该函数的作用域为当前文件。

  • 修饰全局变量,限定作用域为当前文件。

const关键字

  • 不是常量,是一个只读变量
  • 不能放在case关键字后面也说明const不是一个常量。
  • 定义时赋值,之后不允许修改。
  • 修饰普通变量

    1
    2
    3
    const int a;
    a还是一个int型变量,const int 顺序可以互换:
    int const a;
  • 修饰数组

    1
    2
    3
    const int a[5];
    int const a[5];
    只读数组
  • 修饰指针

    1
    2
    3
    4
    const char *p;
    char const *p;//这两种,const都是修饰*p,则p指向的变量只读。(与下一种对照记忆)
    char * const p;//const很明显修饰指针p,则指针p不能被修改。
    const char * const p;//指针p不能被修改,指向的对象也不能被修改。
  • 还可以用在函数传值,增强程序健壮性

    1
    2
    3
    4
    5
    6
    void apple(const char *a){//防止修改a指向的字符串
    ...
    }
    void apple(char * const a){//防止修改a本身
    ...
    }

数组&指针

1
2
char *p="hello";//字符串是一个只读的常量
char a[]="hello";//此时初始化的数组可以修改。

多维数组

C语言不能像一位数组那样,给函数传递一个多维数组。
只能再函数的形参处写明除第一下标之外的其他下标。

1
2
3
4
5
6
7
8
int function(int a[]);

int a[10];
function(a);
-----------------------------------
int function(int a[][3][4]);//需写明下标
int a[4][3][4];
function(a);

欢迎与我分享你的看法。
转载请注明出处:http://taowusheng.cn/