C语言
第一个C语言
// 行注释 只能注释一行
/*
块注释 可以注释多行(不能嵌套)
*/
#if 0
条件注释
#endif
//stdio.h 标准的输入输出头文件 告知编译器printf存在
//头文件 类型、宏定义 函数、变量声明
#include <stdio.h>
//main是主函数 C语言的程序 入口 一个工程中 只能有一个main函数
//main左边的int 是返回值类型
//(函数的形参:形参类型 形参名) 是函数内部 获得外部数据的桥梁
int main(int argc, char *argv[])
{//{}表示复合语句
//printf将""里面的字符串输出到屏幕 '\n'换行/刷新缓冲区
//;在C语言中 结束语句 代表一条完整的语句
//c语言中 所有变量、函数、类型 必须在使用前定义好
printf("欢迎来到周小继的博客\n");
//先:将返回值0 返回 后:结束main函数
return 0;
}
要注意的是:这个return的作用不仅仅是返回一个值,还有一个功能就是结束程序。
关键字
char :字符型
short :短整型
int :整形
long:长整形
float:单精度浮点型
double:双精度浮点型
以上的六个数据类型是基本类型,还有一些构造的类型,比如:struct(构造类型),union(联合体),enum(枚举)。
像上面的int,double,float,short,都默认为有符号类型。当我们想要显式的表达一个数据的有符号类型,用signed
signed int a = 0; //显式的有符号
unsigned int a; //无符号
存储类型的关键字
register:寄存器变量
register int num;//num会尽量放置在寄存器中
volatile:防止编译器优化(或者叫强制访问内存操作)
volatile int num;//不管num多频繁使用 必须每次从内存中取值
volatile表明,某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。这里所谓的优化就是将这个变量放入寄存器中,方便系统的调用。
const:修饰变量只读
const int num=10;
num=100;//err 只读 不允许赋值
被const修饰的东西不能改变,他可以修饰函数的参数,返回值等等。
int a =10;
const int *p = &a; //const修饰的为*p,即为这个p指向的值不能被修改
int const * p = &a; //这个有一定的迷惑性,其实看其修饰的是什么就好,以上面的功能相同
int * const p = &a; //const修饰的为p,即这个p的指向不能被修改
const int * const p = &a; //p与*p均不能被修改
auto自动变量
int num;//默认就是auto
extern声明变量或者函数在外部也可以使用
extern一般用在多文件的编程中,让多个文件都能够使用某一个函数或者变量,在其前面加上这个关键字即可。
typedef为已有的类型取别名
typedef struct Stu
{
char name[32];
int number;
float score;
}stu;
那么这个stu就是struct Stu的别名,这个typedef的使用有几个注意点:
1.它不能够创建一个新的类型,他是类型的别名。
2.取别名之后,原来的类型依然有效。
3.使用的时候,放在以前类型的前面,最后面加上你想定义的别名即可。
void空类型
void用的地方还是非常多的,函数的返回值,函数的参数。
堆区开辟空间的时候
void test(void)//void作为函数的返回值和参数
{
printf("周小继\n");
}
int * p = (int *)malloc(int);
开辟堆区空间的时候,他的返回值为void *类型,需要对其进行强转,void *也被称为万能指针。