系列文章目录
文章目录
前言
引用左耳朵耗子(陈皓)的文章里的一句话:现在的这个社会更多地去关注那些时髦的技术,而忽略了这个流行了40+年的C语言。一门技术如果能够流行40多年,这才是你需要去关注和学习的技术,而不是那些刚出来的技术。这才是踏踏实实的精神。本系列文章可供学习过C语言的复习使用。
一、C语言是什么?
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
深入学习C语言可以帮助我们更加深入的了解计算机底层的运作,编程与系统的关系,学会C的编程逻辑对未来学习任何语言都有很大的帮助。
C语言是一门面向过程的编程语言,与C++,Java等面向对象的编程语言有所不同。
二、C的部分基础语法
首先我们得记住main函数是程序的入口
一个工程中main函数有且仅有一个
数据类型
为了更加丰富的表达生活中的各种值,有了很多种基本数据类型,比如int ,char。他们各自再占用存储空间不同,但又具体占多少呢,可以使用sizeof()运算符计算。
代码如下:
int main()
{
printf("类型 所占字节\n");
printf("char %d\n", sizeof(char));
printf("signed char %d\n", sizeof(signed char));
printf("unsigned char %d\n", sizeof(unsigned char));
printf("int %d\n", sizeof(int));
printf("unsigned int %d\n", sizeof(unsigned int));
printf("short %d\n", sizeof(short));
printf("unsigned short %d\n", sizeof(unsigned short));
printf("long %d\n", sizeof(long));
printf("unsigned long %d\n", sizeof(unsigned long));
printf("long long %d\n", sizeof(long long));
printf("unsigned long long %d\n", sizeof(unsigned long long));
printf("float %d\n", sizeof(float));
printf("double %d\n", sizeof(double));
printf("long double %d\n", sizeof(long double));
return 0;
}
运行截图:
变量和常量
我们首先来看常量,顾名思义,常量是不可更改固定的量,那在C语言中有哪些呢,回想一下你认识的有哪几类
常量主要分为以下四种
- 字面常量
- const 修饰的常变量
- #define 定义的标识符常量
- 枚举常量
#include <stdio.h>
//举例
enum Sex
{
MALE,
FEMALE,
SECRET
};
//括号中的MALE,FEMALE,SECRET是枚举常量
//枚举常量默认默认从0开始
//若想改变,直接在定义是赋值即可,后续未赋值将会依次排列,如定义中MALE=2,则FEMALE自动等于3,SECRET等于4
void test()
{
printf("%d\n", MALE);//值为0
printf("%d\n", FEMALE);//值为1
printf("%d\n", SECRET);//值为2
}
int main()
{
3.14;//字面常量
1000;//字面常量
const float pai = 3.14f; //const 修饰的常量
pai = 5.14;//ok?
#define MAX 100 //#define的标识符常量
return 0;
}
其他都好理解,但我们来对const修饰的常量做一个猜想,它修饰的值真的不能改变吗?
C语言最难的地方就是指针,但指针也确实好用,指针也就是地址。上述const修饰的变量,是否可以用指针来间接改变呢?
一个数据存在,则必有对应的存储空间,我们可以地址找到存储数据的空间,然后用指针来改变空间里的数据,不妨试一试
int main()
{
const int n = 100;
//int arr[n]={ 0 };//不能用来定义数组大小,也说明它并不是一个真正的常量
//我们可以间接更改它的值
// 但是C++中const修饰的变量是真的不可改变
printf("修改前:%d\n", n);
int* p = &n;
*p = 200;
printf("修改后:%d\n", n);
return 0;
}
总结:
C语言中const修饰的并不是真正的常量,只是不能通过它修饰的变量去改变原来的属性,但可以通过间接使用指针来修改。
变量就是可以改变的量。除了上述四种常量,其他都是变量。
变量的作用域和生命周期
作用域
作用域(scope),程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的.
而限定这个名字的可用性的代码范围就是这个名字的作用域。
- 局部变量的作用域是变量所在的局部范围。
- 全局变量的作用域是整个工程。
生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
- 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
- 全局变量的生命周期是:整个程序的生命周期。
转义字符
直接上图
#include <stdio.h>
int main()
{
//问题1:在屏幕上打印一个单引号',怎么做?
//问题2:在屏幕上打印一个字符串,字符串的内容是一个双引号“,怎么做?
printf("%c\n", '\'');
printf("%s\n", "\"");
return 0;
}
//程序输出什么?
#include <stdio.h>
int main()
{
printf("%d\n", strlen("abcdef"));
// \32被解析成一个转义字符,8进制不能出现8以上包括8的数字
printf("%d\n", strlen("c:\test\328\test.c"));
return 0;
}
关键字extern
extern 声明外部符号,来自同目录下的其他源文件
extern int a;声明外部全局变量
extern Add(int ,int );声明外部函数
若不声明将无法使用a和Add函数
关键字static
修饰变量时,没有被初始化时会被自动初始化为0
static在C语言中的三种用法
修饰函数中局部变量
- 生命周期延长:该变量不随函数结束而结束
- 初始化:只在第一次调用该函数时进行初始化
- 记忆性:后序调用时,该变量使用前一次函数调用完成之后保存的值
- 存储位置:不会存储在栈上,放在数据段
- 作用域:不变
修饰全局变量
改变该变量的链接属性,让该变量具有文件作用域,即只能在当前文件中使用。
此时会发生错误:无法解析的外部命令
总结:
默认一个全局变量具有外部链接属性
而如果全局变量被static修饰
全局变量的外部链接属性被改变成了内部链接属性,这个时候只能在本文件使用,其他源文件无法链接,也不能使用
static修饰函数
改变该函数的链接属性,让该函数具有文件作用域,即只能在当前文件中使用
总结:
static修饰函数
函数具有外部链接属性
加上static后改变了其外部链接属性为内部链接属性
其他源文件不能链接,也不能使用