C语言的关键字
===================
static const typedef extern define 。。。。。。。
多个.c文件一起编译: gcc main.c bluetooth.c wifi.c -o main
偷懒写法: gcc *.c -o main //把所有的.c文件一起编译
动态内存分配:指的是malloc calloc realloc分配的内存
(1)static和extern配合
第一种: 修饰变量
修饰全局变量:(使用频率最高)
正常情况下(没有用static修饰)全局变量可以在定义它的文件中使用,也能在其它文件中使用(extern声明一下即可)
static修饰了全局变量,相当于限制了全局变量的作用范围(该全局变量只能用于定义的那个文件,其它文件不能使用,哪怕extern声明也不行)
修饰局部变量:(实际开发往往用来修饰统计变量)
表示这个局部变量只能被初始化一次
第二种:修饰函数
正常情况下(没有用static修饰)函数可以在定义它的文件中使用,也能在其它文件中使用(extern声明一下即可)
static修饰了函数,相当于限制了函数的作用范围(该函数只能用于定义的那个文件,其它文件不能使用,哪怕extern声明也不行)
(2)extern
第一种:声明外部的全局变量
第二种:声明外部的函数
(3)const
第一种:修饰常量(常量是只读,不能修改)
const int a=9; //定义了一个常量a
第二种:修饰指针
int a=99;
写法一 const int *p=&a; //写法一和写法二是等价,表示这个指针不能修改它指向的地址中的内容(实际开发中,防止指针修改你地址中的内容)
写法二 int const *p=&a;
size_t strlen(const char *s);
strlen(buf)
写法三 int *const p=&a; //p可以访问a的值,也能修改a的值,但是不能指向其它变量的地址(你可以认为p跟a的地址捆绑在一起了)
(4)typedef 类型重定义
作用:给C语言原本的数据类型改个名字(增强可读性,便于移植程序)
size_t --》类型没有见过 typedef unsigned long size_t;
写法一:给基本数据类型换名字
typedef int zhengshu;
写法二:给指针换名字
公式: typedef 指针原本的定义;
typedef char *pp; //给char *换个名字叫做pp, pp不是变量名,是类型名
typedef char (*p)[10]; //给char (*)[10]数组指针换了名字,叫做p p不是变量名,是类型名
写法三:给数组换名字
公式: typedef 数组原本的定义;
typedef char buf[10]; //buf不是数组名,是类型名 char [10]类型
可移植数据类型:见图示
C语言主函数传参
=================
C语言主函数的写法:
void main()
int main()
int main(int argc,char **argv) // ./a.out hello hehe
int main(int argc,char *argv[])
argc --》参数个数
argv[0] --》第一个参数
argv[1] --》第二个参数
注意:主函数传参,传递的参数默认当成字符串处理
作业:
1. typedef给一个函数指针换名字, 使用更换的类型名定义一个函数指针
int add(int a,int b); --》函数指针类型 int (*p)(int,int);
typedef int (*p)(int,int); //p不是指针变量, 是一种数据类型
p q=add; //p是数据类型 q指针变量
2. 封装一个函数,判断字符串A是不是字符串B的子串,如果是返回A在B中首次出现的位置(返回指针)
char *getstr(char *A,char *B)
{
}