C语言学习(11)
C语言的关键字
static、const、typedef、extern、define……
动态内存分配: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;
写法三 int *const p=&a; //p可以访问a的值,也能修改a的值,但是不能指向其它变量的地址(你可以认为p跟a的地址捆绑在一起了)
(4)typedef 类型重定义
作用:给C语言原本的数据类型改个名字(增强可读性,便于移植程序)
u8 --》类型没有见过 typedef unsigned char u8;
写法一:给基本数据类型换名字
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]类型
1 #include <stdio.h> 2 //把int换个名字 3 typedef int zhengshu; //zhengshu以后作为int直接使用 4 typedef char *pp; //pp以后可以作为char *类型直接使用 5 typedef char (*charpp)[10]; //charpp以后可以作为char (*)[10]类型直接使用 6 typedef int array[10]; //array以后可以作为int [10]类型直接使用 7 int main() 8 { 9 int a=99; 10 zhengshu b=88; //等价于int b; 11 printf("b is:%d\n",b); 12 13 //传统定义char *指针 char *p=buf; 14 char buf[10]="hello"; 15 pp p=buf; //char *p=buf 16 printf("p is:%s\n",p); 17 18 //传统定义char (*)[10] 19 charpp point=&buf; //char (*point)[10]=&buf 20 21 //传统定义数组 int c[10]; 22 array c; // int c[10] 23 c[0]=99; 24 c[1]=88; 26 }
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] --》第二个参数。
注意:主函数传参,传递的参数默认当成字符串处理