嵌入式Linux学习前置技能-C语言之头文件的引用、宏定义、定义与声明、数据类型、数组、结构体

前言

C语言复习线第一篇,前几天总结的C语言难记知识点。

头文件的引用

#include “头文件”1 #include <头文件>
在当前文件夹中寻找,当前文件夹中没有找到就去系统库中寻找 直接在系统库中检索头文件

宏定义

#define 标识符 常量

#define:在预编译时将所有该标识符替换为该常量。

#define与typedef的区别:

#define 标识符 常量 typedef 类型名 类型别名
预编译是处理,将标识符替换为常量 编译时处理,给当前作用域内的类型赋一个别名

定义(definition)和声明(declare)

变量定义:用于为变量分配储存空间,还可为变量赋初始值。在程序中每个变量有且只有一个定义
变量声明:用于向程序表明变量的类型和变量名。
定义也是声明:定义变量的同时声明了类型和名字
extern:声明 (此次声明)不是定义,即该变量的定义在其他文件,再次只进行声明。
当在声明时进行初始化时,相当于定义,即:

int a = 1; <=> extern int a = 1;

任何再多文件中使用的变量都需要有与定义分离的声明,即在一个definition.c文件中进行定义,在需要引用该变量的.c文件中包含definition.h后使用extern进行声明。定义只能有一个,生命可以有无数个。

#include <stdio.h>
#include "dedinition.h"
extern int a;//声明,a的定义在definition.c
//声明外部变量时可以把变量类型省略,如:extern a。;
extern int b = 1;//对声明进行初始化,即定义。;
/*extern 声明只有在在函数外部时可初始化,
如果其他文件中已有b的定义,这样会报错,相当于进行了重复定义。*/

int main(void)
{
	int c  = 1;//定义一个变量并初始化。
	int c = 2;//重复定义,会报错。
	int d; //定义一个变量,不初始化。
	extern int e;//在该函数中引用外部变量e。
	extern int f = 1;//不允许的初始化方式,会报错。
	
	return 0;
}

数据类型

数据类型

数据类型 长度 输出类型
int 4Byte %d或%i
short 2Byte %d或%i
long 8Byte %ld
char 1Byte %c
位、字节、字:
字节
bit Byte word
1 11111111 处理器位数个bit
位(bit):每一个位只能为0或1两个状态。
字节Byte:8位二进制数据组成一个字节(Byte),他是储存空间的基本计量单位。
一个英文字母占一个字节,一个中文字符占两个字节。
字(word):由若干个字节构成,字的长度为字长,字长由系统的位数决定。

数组

定义:类型说明符 数组名[常量表达式];

int a[3];

数组a中有三个元素:a[0]、a[1]、a[2]
数组的初始化:

int a[3] = {0,1,2};//定义是初始化只能顺序初始化,未赋值的默认初始化为0
int a[3] = {0,1};//此时a[2] = 0
int a[] = {0,1,2};//自动定义a有三个元素

错误的初始化:

int a[];						//✖
int a[3] = {};				//✖
int a[3] = {0,1,2,3};	//✖

【注】:
数组名除表示该数组外还表示数组的首地址;
数组中元素在内存中的地址是连续分配的

结构体

定义:
1.先定义在声明:

struct s_name
{
	成员;
};//定义
struct s_name varname;//声明变量 

2.定义的同时声明:
struct s_name
{
成员;
}var1,var2;//定义的同时声明var1,var2两个变量
struct s_name varname;//需要其他变量时还可以继续声明变量

或者
struct
{
	成员;
}var1,var2;//定义的同时声明var1,var2两个变量,该结构体只有两个变量,无法继续声明其他变量

3.使用typedef定义结构体

typedef struct s_name
{
	成员;
}tt;//tt表示struct s_name这个数据类型,之后可以使用tt直接定义新的结构体变量

结构体初始化:

struct s_name
{
	int a;
	int b;
	int c;
}varname;
struct s_name varname = {1,2,3};//顺序赋值
struct s_name varname = {.a = 1,.c = 3};//乱序赋值C语言风格
struct s_name varname = {a:1,.c:3};//乱序赋值C++风格

/*先定义后初始化*/
varname.a = 1;
varname.b = 2;
varname.c = 3;

指针


  1. #:预编译(或预处理)标识。预编译不是编译,而是在编译前对预编译标识后代码的处理。 ↩︎

原创文章 9 获赞 1 访问量 607

猜你喜欢

转载自blog.csdn.net/hengxing666/article/details/105403161