初识C语言:
前言:
初始C语言不讲求面面俱到,只是对C语言有一个大概的了解。
1.C语言概述:什么是C语言?
详细的内容太罗嗦,说点基本的就好,其余想了解一查就可以了,C语言是一门通用的计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译,处理低级存储器,产生少量机器码,以及不需要任何运行环境便能运行的编程语言。
C11标准为C语言的最新标准。
下面是计算机原理的简化图:
硬件与操作系统之间的联系是通过驱动进行的,操作系统控制着软件,在这里,驱动程序,操作系统,软件都可以通过C语言写出。
2.第一个C语言程序
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
printf("Hello World!");
return 0;
}
简单了解一下:
#define _CRT_SECURE_NO_WARNINGS
因为有很多的编译器可以写C语言,我用的是VS2019,而VS2019中输入函数scanf()会被认定不安全,所以必须要加上这样一段话才能使scanf()正常使用。
#include<stdio.h>
这段代码的意思为引入头文件
int main()
{
printf("Hello World!");
return 0;
}
main()函数为主函数,是所有C语言执行程序的入口,printf()函数是输出打印函数,return 0,为返回值,0为正常返回,非0为异常返回。
3.数据类型
整数
- char (字符数据类型)——1 byte
- short(短整型)————2 byte
- int(整型)——————4 byte
- long(长整型)————4 byte
- long long(更长的整型)——8 byte
小数
- float(单精度浮点型)——4 byte
- double(双精度浮点型)——8 byte
注:字节(byte)和比特位(bit)都是计算机的存储单位,比特位是最小的储存单位。
1 byte=8 bit
4.变量与常量
不变的值,C语言中用常量来表示,可以改变的值,C语言中用变量来表示。
1)变量的定义方法:
int a=10;
float b=3.14f;
char c='c';
如上图所示:数据类型+变量名称=值;
2)变量的命名规则:
只能由字母,数字或下划线构成,不能以数字开头不能使用关键字,变量名中区分大小写,建议以数据的英文名字来命名,方便使用数据。
3)变量的分类:
- 局部变量
- 全局变量
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int global = 2019;//全局变量
int main()
{
int global = 2022;//局部变量
printf("%d", global);
return 0;
}
结果调用时,就近原则,使用的是局部变量的global
4)变量的使用周期:
1.局部变量的生命周期为:进入作用域开始,到离开作用域结束。
2.全局变量的生命周期为:整个程序的生命周期
补:要是在别的文件中有int a=10;那么在本文件中引用需要extern int a;
extern 的意思就是声明一下在本文件中引用了别的文件的数据。
5)常量:
常量可以分为如下几种:
- 字面常量
- const修饰的常变量
- #define修饰的标识符常量
- 枚举常量
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
enum Sex
{
male,
female,
secret
};//括号中的是三个枚举常量
int main()
{
3.14;//字面常量
const int a = 10;//const修饰的变常量,其值不能随便修改
#define MAX 100//define修饰的标识符常量
printf("%d\n",a);
printf("%d\n",MAX);
printf("%d\n", male);
printf("%d\n", female);
printf("%d\n", secret);//枚举常量数值是从0开始的
return 0;
}
结果如下:
5.字符串+转义字符+注释
1)字符串:
现有如下代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
char arr1[] = "bit";
char arr2[] = {'b','i','t'};
char arr3[] = {'b','i','t','\0'};
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
return 0;
}
输出结果为:
之所以会出现这种结果就是因为如arr1那样的数组是直接将一个字符串放了进去,而用arr2和arr3那样创建字符串的方式,就要考虑字符串的结束标志:‘\0’,正是因为没有看到这个标志才会导致arr2输出了那样的结果。
2)转义字符:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
printf("c:\code\test.c\n");
return 0;
}
这串代码的结果:
因为这里就有许多的转义字符,并不能按照想象中的内容输出,下面是一些常用的转义字符:
- \? 表示为问号
- \’ 表示为一个单引号
- \"表示为一个双引号
- \\ 表示为一个反斜杠
- \a 表示为警告字符,蜂鸣
- \b 表示为退格符
- \f 表示为进纸符
- \n 表示为换行
- \r 表示为回车
- \t 表示为水平制表符
- \v 表示为垂直制表符
- \ddd 表示为1~3个8进制数字
- \xdd 表示为2个十六进制数字
eg:
printf("%c\n",'\X3a');
此代码结果为输出一个分号,a在十六进制中代表10,因为十六进制中10~15,是用a~f表示的,所以结果就是
10
×
1
6
0
+
3
×
1
6
1
=
58
10\times16^{0}+3\times16^{1}=58
10×160+3×161=5858对应的ASCLL值就是一个分号
这里有一个新概念就是ASCLL值,ascii码就是把字母、数字和一些特殊符号转换成 一些2进制数的一种标准。
如下表:
6.注释
单行注释和多行注释
单行://
多行:/* 对应内容 */
7.选择语句
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a = 1;
scanf("%d", &a);
if (a > 5)
{
printf("大于五");
}
if (a == 5)
{
printf("等于五");
}
else {
printf("小于五");
}
return 0;
}
scanf为输入函数,输入一个数字,if是条件语句,括号中是判断条件,如果满足就执行括号中的语句,else的意思是如果以上都不满足就执行else中的语句。
8.循环语句
C语言中有三种循环:
- while循环:
while(条件)
{
执行的语句……
}
- for循环
for(int i=0;i<5(判断条件条件);i++)
{
执行的语句……
}
- do……while循环
do{
执行的语句……
}while(判断条件)
前两个循环与后一个循环的本质区别就是前两个循环是先进行判断再执行语句,而后一个循环是先执行语句在进行判断
9.函数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int Add(int a, int b)
{
int z;
z = a + b;
return z;
}
int main()
{
int num1, num2;
printf("Please input two numbers:");
scanf("%d %d", &num1, &num2);
int result=Add(num1, num2);
printf("The Result is:%d", result);
return 0;
}
这段代码中就使用了函数,函数的作用就是避免代码的重复,因为就比如这个相加的代码,每当我使用的时候就会重新写一遍,但是我把他们集合到一个Add()函数里面随时用随时引用就好了。
下面是对函数的讲解:
int Add(int a, int b)
{
int z;
z = a + b;
return z;
}
在这里函数的名字为Add,根据函数功能的不同可以起不同的名字,Add前面的int是函数的返回值类型,括号中的是函数需要的形式参数及类型,不同的函数所需的参数个数以及参数类型都不一样,可以按照需求进行更改。
int result=Add(num1, num2);
有因为返回的是整型,即z的值,所以需要定义一个整型变量来接收。
10.数组
int arr[10]={1,2,3,4,5,6,7,8,9,10}
参照上图为数组的定义,int为数组存放类型,arr为数组名字,[ ]中的数字为数组的大小,{ }中的为数组储存的元素,用逗号隔开。
|int arr[10] | 下标 ||–|–|
| 1 | 0|
| 2| 1|
| 3| 2|
| 4 | 3 |
| 5 | 4 |
| 6 | 5 |
| 7| 6 |
| 8| 7 |
| 9| 8 |
| 10| 9 |
在数组的储存过程中,对应元素相应会有与之对应的下标,如元素2对应arr[1],因为数组的下标是从0开始计算的,所以不是arr[2]。
数组的使用:
#include<stdio.h>
int main()
{
int i=0;
int arr[10]={1,2,3,4,5,6,7,8,9,10};
for(i=0;i<10;i++)
{
printf("%d",arr[i]);
}
return 0;
}
将其放入循环中去,依次打印出对应元素
11.操作符
1)算数操作符:
+:加法运算
-:减法运算
*:乘法运算
/:除法运算(整型之间相除只保留整数部分eg:7/2=3)
%:取余运算
2)赋值操作符
+=
-=
*=
/=
%=
以上几种等式用法为:eg:a+=b相当于a=a+b
3)单目操作符
4)条件操作符
exp1 ? exp2 : exp3
该条语句的意思为先判断exp1为真还是假,如果为真就执行exp2,否则就执行exp3。
eg:
int i=1;
i==1?i++:i--;
该条语句执行的是i++
12.常用关键字
C语言提供了丰富的关键字,这些关键字都是预设好的,关键字是不可以自己创建的。
之前介绍的变量类型不再赘述
挑出几个介绍,其余的后边运用到的时候再讲。
extern 是声明外部符号
register 寄存器关键字
以上便是电脑数据的存储方式
从上到下空间依次变得越来大,但是读取的速度越来越慢
sizeof是一个操作符,用来计算关键字的长度的
1)关键字typedef
typedef的意思为类型的重命名
typedef int ppp;
int i=1;
ppp q=2;
return 0;
上面两个语句的意思是一样的。
2)关键字static
static关键字可以修饰局部变量,全局变量,函数。
1.修饰局部变量-称为静态局部变量
代码一:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void test()
{
int a = 1;
a++;
printf("%d", a);
}
int main()
{
for (int i = 0; i < 10; i++)
{
test();
}
return 0;
}
代码二:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void test()
{
static int a = 1;
a++;
printf("%d", a);
}
int main()
{
for (int i = 0; i < 10; i++)
{
test();
}
return 0;
}
结果一:
结果二:
造成结果不同的原因就是static将a这个局部变量的生命周期改变了,当a变为静态局部变量的时候其生命周期为程序结束,所以代码二中a的值不断累加,而代码一中每次a都被定义然后销毁。
2.修饰全局变量-称为静态全局变量
a文件:
#define _CRT_SECURE_NO_WARNINGS
static int a = 2022;
b文件:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
extern int a;
printf("%d", a);
return 0;
}
报错了,因为static将全局变量a的外部链接属性变为内部链接属性,所以在b文件中不可以被引用,便报错了。
3.修饰函数-静态函数
与修饰全局变量一样,只能在本文件中使用,不能在外部文件中使用
所以修饰的函数不能被引用。
计算机中存储内存分为栈内存,堆内存,静态区,栈内存中存储局部变量和形式参数,到其生命周期后就弹栈消失。静态区的变量则会直到程序结束的时候才会消失。
13.#define定义常量和宏
#define MAX 100 //定义常量
#define ADD(x,y) ((x)+(y)) //定义宏
这样定义之后在后边的代码里,MAX就是100,ADD()就是两个数相加的函数
eg:
ADD(10,20)结果就是30
14.指针
在计算机存储时,每一个字节都会被分配一块空间,并有一个地址,而指针就是用来储存这个地址的。
如上图,定义一个整型变量,因为前面讲过一个整型变量是四个字节,所以会分配四个空间来储存,而num的地址是由第一个字节的地址所组成,比如上图中num的地址就是0x0012ff44
*是解引用符号,*p就是定义的指针变量存储地址所指向的对象,用来接收地址的,由图中可以看出,指针变量p接受了num的地址后将其改为20。
15.结构体
例如:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
struct stu
{
char name[20];
int age;
char id[20];
};
int main()
{
struct stu s1 = { "张三",21,"20203989" };
struct stu s2;
struct stu s3 = { "李四",22,"20204580"};
scanf("%s %d %s", &s2.name, &s2.age, &s2.id);
struct stu* p = &s3;
printf("%s %d %s\n", s1.name, s1.age, s1.id);
printf("%s %d %s\n", s2.name, s2.age, s2.id);
printf("%s %d %s\n", p->name, p->age, p->id);
return 0;
}
在描述日常生活中的事物时,我们所学的变量类型太单一,一次只能描述一个类型,就好比一个学生,描述它就要用到姓名,年龄,班级,学号,身份证号等等,这个时候就需要结构体,把所有的特点囊括到一个结构体里。
如上面的代码,stu是一个结构体,而他里面有姓名,年龄,学号这三个内容。
1) s1的定义和输出就是基本的结构体的应用。
2) s2结构体的输入演示
3) s3是定义了一个结构体指针p来接收s3的地址,从而访问s3,这里介绍到指针除了可以使用’.‘以外,还可以使用’->'来访问。
以上便是对C语言的初识,谢谢。