1.C语言概述
在日常生活中,人之间的交流都是通过语言,例如汉语,英语来交流的。当我们需要与计算机进行通信的时候,这就需要用到计算机语言。C语言是一门通用的计算机语言,广泛应用于底层开发;
计算机语言的发展:低级->高级
如:二进制指令(10100010)->汇编指令(助记符)->B语言->C语言(高级语言)
C语言是高级语言,编辑完的源程序(.c),不能直接在机器上运行,需要进行编译生成目标程序(.obj),目标程序连接系统库函数文件生成可执行程序(.exe);
常用的编译器有:Clang,GCC,WIN-TC,MSVC,Turbo-C等;
2.第一个C语言程序
通过这个程序可以初步了解C语言的简单语法特点和结构。
#include<stdio.h> //将stdio.h库文件包含在该文件中
int main()
{
printf("welcome to c world!!"); //printf是库函数,专门用来打印数据的
return 0;
}
printf 是C语言标准库函数,定义于头文件 <stdio.h>,使用前要对头文件进行引用,std是标准,i是输入,o是输出,此头文件内部包括输入/输出函数的信息;
#include<stdio.h>预处理指令,告诉编译器在这里要包含一个叫stdio.h的文件;
main是主函数,是程序的入口,有且仅有一个;
3.数据类型
计算机处理的对象是数据,而数据是以某种形式存在的。为了能准确使用数据描述生活中的各种信息,如3,3.14,字符等,c语言将数据划分了不同的数据类型。
可以用sizeof();库函数查看数据类型的大小;
在不同计算机上,int的大小不一样,32位机器int是2byte,64位机器int是4byte;
%zu是打印sizeof返回值;
4.变量和常量
常量是指在程序运行过程中值不能改变的量,变量是程序运行过程中其存储的值可以改变的量;
4.1变量
变量的定义:数据类型 变量名1(,变量名2...);
变量的创建本质是向内存申请空间。
变量的作用域:变量的可用性范围;
变量的生命周期:指变量在程序运行过程中的存在时间;
变量可分为局部变量和全局变量。局部变量的作用域在其局部范围,其生命周期从进入作用域开始,出作用域结束。全局变量的作用域是整个工程,生命周期是整个程序的生命周期。
同一个工程下,另一个源程序想使用这个变量需要用extern声明;
4.2.常量
1.字面常量
如:30,3.14,'a',"abc"
2.const修饰的常变量
const修饰的变量,本质上还是变量,但不能修改,具有了常量的属性。
3.#define定义的标识符常量
4.枚举常量
#define pi 3.1415f //标识符常量
enum color
{
red, //枚举常量
green,
blue
};
5.字符,字符串,转义字符
字符包括字母、数字、运算符号、标点符号和其他符号,以及一些功能性符号。
字符型数据在内存存储的是其ASCII编码值,所以字符型数据和整型数据在c语言可以通用,只不过字符型存储字节为1byte.
字符常量是用一对单引号括起来的一个字符,书写形式如:'a','b'
字符串常量用一对双引号括起来的零个或多个字符序列,书写形式如:"abcdef","shfk"
没有相应的字符串变量,可以用字符数组来存放字符串。
注意:字符占1byte的内存空间,而字符串占的内存空间是字符串中字节数加上字符串结束标志'\0'(ascii值为0)
sizeof计算一种数据类型所占存储空间长度(byte);
strlen计算字符串的长度,单位:byte,遇到'\0'这个标志停止计算,不计算\0;
若定义一个不带'\0'的字符数组,strlen计算时,编译器找不到'\0',就会继续往下寻找'\0',直到找到,所以下面就输出15了。printf也是,找不到\0,就一直向下打印直到找到字符串结束标志\0停止。
转义字符,显而易见,就是转变了原有字符的含义,具有特定的含义,实现了一些控制功能,是一种特殊的字符常量。
6.注释
帮助程序的理解
1./* 注释内容 */
2. //注释内容
7.选择和循环语句
当遇到需要选择判断的时候 ,我们就需要用到选择语句if和switch.
在使用if时只能进行两路的选择,在实现多路选择时需要使用多个if嵌套,所以用if解决多路问题有些不便,这时候可以用switch实现多分支程序设计。
if (条件) 语句1;
else 语句2;
当条件成立的条件下,执行语句1,不成立则执行语句2,else也可以省去,如: if (条件) 语句;
当条件成立则执行语句。
switch,先对括号中的表达式进行计算,然后按顺序找出某个常量值与计算值相匹配的case,以此为入口,执行case语句后各个语句组,直到遇到break或switch的右花括号终止语句。若没有匹配的就执行default后的语句。
当我们需要重复做一件事的时候可以考虑循环while,do..while和for.
while当型循环,当条件成立执行循环体。
do...whiile,直到型循环,先执行循环体,后判断是否继续执行循环体。
for格式化的循环语句,用起来更加的方便。
for 基本形式
for(循环变量赋初值;循环继续条件;循环变量增值)
语句;
8.数组
数组就是相同类型元素的集合。
数组的定义,
类型符 数组名[常量表达式];
在定义时,[]为数组的元素个数,这个常量表达式必须时正整型。
数组的使用,c语言规定数组只能逐个引用,不能一次引用整个数组。
数组通过下标引用,
引用格式:数组名[下标表达式]
数组的下标时从0开始的,如
当我们要引用第三个元素的时候,是数组名[2];这样引用。
int main()
{
int i = 0;
//创建5个元素的数组并赋值
int arr[5] = {1,2,3,4,5};
arr[2] = 10; //访问数组第三个元素,赋值
while (i < 5)
{
printf("%d ", arr[i]);
i++;
}
return 0;
}
9.函数
函数实现了程序的模块化,支持了可移植性,提高了程序的效率。
函数有两种,一种是系统提供标准库函数,使用前需要包含对应的头文件,另一种是用户自定义的,需要先定义后再使用。
一个c工程必须包含一个main函数,可以有多个.c文件。
10.操作符
操作符是对数据进行操作,操作符连接数据形成的式子叫表达式。
11.常见关键字
关键字是特殊的标识符,是C语言规定的,有特定的含义。
以下介绍两个关键字
关键字typedef:类型定义,可以理解为类型重命名,如图,可见创建的变量都是unsigned int类型
关键字static:用来修饰变量和函数的
1.修饰局部变量,被称为静态局部变量;
2.修饰全局变量,被称为静态全局变量;
3.修饰函数,称为静态函数;
内存可分为栈区,堆区,静态区等,栈区的数据出了作用域就销毁,静态区的数据出了作用域不会销毁,直至程序的结束,所以局部变量是存在栈区的,全局变量是存在静态区的。
1.
#include<stdio.h>
void test()
{
static int a = 1;
a++;
printf("%d",a);
}
int main()
{
int i=0;
while (i<10)
{
test();
i++;
}
return 0;
}
//运行结果是234567891011
static修饰局部变量的时候,局部变量出了作用域不销毁,本质上,static修饰局部变量的时候,改变了变量的存储位置(从栈区到静态区),改变了变量的生命周期。
static修饰的变量只初始化一次,再次调用不会被初始化。
2.全局变量和函数是有外部链接属性的,static修饰全局变量和函数的时候,其外部链接属性就变成了内部链接属性,同个工程下的其他源文件(.c)就无法使用了,会出现解析错误,链接错误。
修饰全局变量
修饰函数
12.指针
要了解指针,先来了解一下内存。
内存用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。它是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中进行。
为了有效的使用内存,就把内存划分为一个个内存单元,每个内存单元的大小是一个字节。为了有效访问到内存的每个单元,就对内存单元进行了编号,这个编号就是该内存单元的地址,这个地址也被称为指针。
存放指针的就是指针变量;
int main()
{
int a = 10; //向内存申请4个字节,存放10
printf("%p\n",&a); //&是取地址操作符,%p是打印数据的地址
//定义指针变量存放a的地址
int* p = &a;
//int是说明p指向的对象是int类型,*说明p是指针变量
*p = 20; //解引用操作符,通过p存放的地址找到p指向的对象,在这里*p就是指向的对象a
printf("%d\n", a);
return 0;
}
13.结构体
结构体是一种自定义类型,可以把一些类型组合在一起的做法。
结构体成员的两种引用方式
1.结构体对象.成员名
struct stu
{
char name[20];
int age;
};
int main()
{
//创建结构体对象
struct stu s = {"张三","20"};
s.age = 26;
printf("%s\n", s.name); //通过结构体对象.成员名引用成员
printf("%d", s.age);
return 0;
}
2.结构体指针变量->成员名
struct stu
{
char name[20];
int age;
};
print(struct stu*ps) //指针变量ps接受传过来的地址
{
printf("%d", (*ps).age); //通过解引用访问对象,再通过结构体对象.成员名引用成员
printf("%d", ps->age); //通过结构体指针变量->成员名引用成员
}
int main()
{
//创建结构体对象
struct stu s = {"张三","20"};
print(&s);
return 0;
}