初识C语言

    • 一.什么是C语言
    • 二.第一个c语言程序
    • 三.数据类型
    • 四.常量变量
      • 4.1 定义变量的方法
      • 4.2 变量的命名
      • 4.3 变量的分类
        • ·全局变量
        • ·局部变量
      • 4.4 变量的使用
      • 4.5 变量的作用域和生命周期
      • 4.6 常量
    • 五.字符串+转义字符+注释
      • 5.1 字符串
      • 5.2 转义字符
      • 5.3 注释
    • 六.选择语句
    • 七.循环语句
    • 八. 函数
    • 九.数组
      • 9.1 数组定义
      • 9.2 数组的下标
      • 9.3 数组的使用
      • 十.操作符
    • 十一.常见关键字
      • 11.1 关键字 typedef
      • 11.2 关键字static
        • 11.2.1 修饰局部变量
        • 11.2.2 修饰全局变量
        • 11.2.3 修饰函数
    • 十二.#define定义常量和宏
    • 十三.指针
      • 13.1 内存
      • 13.2 指针变量的大小
    • 十四.结构体

前言
本片博客为大家初步认识C语言,能够读懂代码而作。也是本人学习成果的体现。文章内容细节满满,本片文章的阅读定会为今后C语言学习打下坚实基础(由于作者水平有限,文中出现错误感谢大家积极提出给予纠正)

一.什么是C语言

C语言是一门计算机通用编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简单的方式编译,处理低级储存器,产生少量的机械码以及不需要任何运行环境支持便能运行的编程语言。

尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含了一些嵌入式处理器(单机芯片或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免个开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语言法,称为ANSIC,作为C语言最初的标准。[1]目前2011年12月8日,国家标准化组织(ISO)和国际电工委员会(IEC)发布C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。

C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程有所语言不同其编译器主要有Clang,GCC,WIN-TC,SUBLIME,MSVC,Turbo C等。

二.第一个c语言程序


在VS上写代码:

  1. 创建项目

  2. 新建源文件 .c文件

  3. 写代码





int main()//int是整型{//写代码的地方printf("hello world\n");printf("欢迎你\n");//printf 是库函数 - C语言的标准库中提供的一个现成的函数-直接可以使用//功能是在屏幕上打印信息//库函数的使用,是需要包含头文件的,printf需要的头文件叫:stdio.hreturn 0;}//非常古老的写法 - 不推荐void main(){printf("hehe\n");}//可以的int main(void)//void是在明确表示main函数不接收参数{//...return 0;} //可以的int main(int argc, char* argv[])//int argc, char* argv[] 是在指定main函数的参数{//...return 0;}

:1.写C语言代码都从main函数第一行开始运行
2.语言中所有的字符都是英文字符

三.数据类型

常见的数据类型

char //字符数据类型
short //短整型
int // 整型
long//长整型
long long//更长的整型
float//单精度浮点数
double//双精度浮点数

测试各数据类型大小

计算机中常见的单位:

1 byte = 8 bit;
1 KB = 1024 byte;
1 MB = 1024 KB;
1 GB = 1024 MB;
1 TB = 1024 GB;
1 PB = 1024 TB;

C语言标准:

sizeof(long long)>=sizeof(long)>=sizeof(int)>sizeof(short)>sizeof(char)

四.常量变量

生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等)
有些值是可变的(比如:年龄,体重,薪资)。
不变的值,C语言中用常量的概念来表示,变得值C语言中用变量来表示。

4.1 定义变量的方法

int age = 150 ;
float weight = 45.5f ; //单精度浮点数float
double weight = 45.5 ;//双精度浮点数double
char ch = ‘w’ ;

4.2 变量的命名

  • 只能由字母,数字,下划线(_)组成
  • 不能以数字开头
  • 长度不能超过63个字符
  • 变量名中区分大小写0
  • 变量名不能使用关键字
  • 变量名尽量有意义

例:

补:
1、数据类型关键字(12个):
(1) char :声明字符型变量或函数
(2) double :声明双精度变量或函数
(3) enum :声明枚举类型
(4) float:声明浮点型变量或函数
(5) int: 声明整型变量或函数
(6) long :声明长整型变量或函数
(7) short :声明短整型变量或函数
(8) signed:声明有符号类型变量或函数
(9) struct:声明结构体变量或函数
(10) union:声明联合数据类型
(11) unsigned:声明无符号类型变量或函数
(12) void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)

2、控制语句关键字(12个):
A循环语句 :(1) for:一种循环语句(可意会不可言传) (2) do :循环语句的循环体 (3) while :循环语句的循环条件 (4) break:跳出当前循环 (5) continue:结束当前循环,开始下一轮循环
B条件语句: (1)if: 条件语句 (2)else :条件语句否定分支(与 if 连用) (3)goto:无条件跳转语句
C开关语句: (1)switch :用于开关语句 (2)case:开关语句分支 (3)default:开关语句中的“其他”分支
D return :子程序返回语句(可以带参数,也看不带参数)

3 、存储类型关键字(4个):
(1)auto :声明自动变量 一般不使用 (2)extern:声明变量是在其他文件正声明(也可以看做是引用变量) (3)register:声明积存器变量 (4)static :声明静态变量

4、其它关键字(4个): (1)const :声明只读变量 (2)sizeof:计算数据类型长度 (3)typedef:用以给数据类型取别名(当然还有其他作用) (4)volatile:说明变量在程序执行中可被隐含地改变

4.3 变量的分类

·全局变量
·局部变量

代码展示:

#includeint global = 2019; //全局变量int main(){int local = 2018; //局部变量int global = 2020; //局部变量printf("global = %d\n", global);return 0;}

·全局变量:在{ }外边定义的变量就是全局变量
·局部变量:就是{ }内部定义的变量就是局部变量
·当局部变量和全局变量同名的时候,局部变量优先使用

4.4 变量的使用

#include int main(){int a = 0; int b = 0;int s = 0;printf("输入两个值:>");scanf("%d %d", &a, &b);s = a + b;printf("sum = %d\n", s);return 0;}

scanf()后的括号内含有&!

4.5 变量的作用域和生命周期

1作用域(空间)
作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的
而限定这个名字的可用性的代码范围就是这个名字的作用域。
·局部变量的作用域是变量所在的局部范围。
·全局变量的作用域是整个工程。

2生命周期(时间)
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
·局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
·全局变量的生命周期是:整个程序的生命周期。

4.6 常量

C语言中的常量和变量的定义形式有所差异。
C语言中的常量分为

  • 字面常量

例:100,‘a’,20.0,3.14 //直接可写出的值

  • const修饰的常变量

格式:const 数据类型 变量名

//const 常属性的//修饰变量int main(){const int a = 10;//a 就是const修饰的常变量,但是本质上a还是变量printf("a=%d\n", a);a = 100;//不可修改printf("a=%d\n", a);return 0;}//数组int main(){int arr[10] = {0};const int n = 10;int arr2[n] = { 0 };return 0;}

  • #define定义的标识符常量

格式:#define 符号常量 常量值

#define M 100int main(){int arr[M] = {0};printf("%d\n", M);int a = M;printf("%d\n", a);return 0;}

  • 枚举常量
    枚举 :一一列举
    三原色:红色 绿色 蓝色
    性别:男、女、保密
    星期:1 2 3 4 5 6 7
//自定义的类型enum Color{//枚举常量RED, //0GREEN, //1BLUE //2};int main(){enum Color c = RED;return 0;}//enum是枚举的关键字enum Sex{MALE=7,FEMALE,SECRET};int main(){//enum Sex s = SECRET;//enum Sex s2 = MALE;printf("%d\n", MALE);printf("%d\n", FEMALE);printf("%d\n", SECRET);return 0;}

五.字符串+转义字符+注释

5.1 字符串

“hello world.\n”

这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符
串。
:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串
内容。

//字符串是可以存放在字符数数组中的//%s 是打印字符串#include int main(){char arr1[] = "abc";char arr2[] = {'a', 'b', 'c'};//printf("%s\n", arr1);//printf("%s\n", arr2);//会显示烫......因为没有出现\0 不可以用%s打印 //strlen是一个库函数 - 求字符串长度的,统计的是字符串中\0之前的字符个数printf("%d\n", strlen(arr1));printf("%d\n", strlen(arr2));//随机值return 0;}

5.2 转义字符

加入我们要在屏幕上打印一个目录: c:\code\test.c
我们该如何写代码?

#include int main(){ printf("c:\code\test.c\n");return 0;}

“运行结果如下

这里就不得不提一下转义字符了。转义字符顾名思义就是转变意思。


注:

a—97 A—65 相差32 可由此推出各个字母
0~31不可打印

  • 八进制:0~7
  • 十六进制:
  • 计算机处理的是二进制
  • 数据在存储的时候也是二进制
#include int main(){//问题1:在屏幕上打印一个单引号',怎么做?//问题2:在屏幕上打印一个字符串,字符串的内容是一个双引号“,怎么做?printf("%c\n", '\'');printf("%s\n", "\"");return 0;}

案例分析:

\t==tab

5.3 注释

  1. 代码中有不需要的代码可以直接删除,也可以注释掉
  2. 代码中有些代码比较难懂,可以加一下注释文字
    比如:
#include int Add(int x, int y){return x+y;}/*C语言风格注释int Sub(int x, int y){return x-y;}*/int main(){//C++注释风格//int a = 10;//调用Add函数,完成加法printf("%d\n", Add(1, 2));return 0;}

注释有两种风格:
C语言风格的注释 /xxxxxx/
缺陷:不能嵌套注释
C++风格的注释 //xxxxxxxx
可以注释一行也可以注释多行

六.选择语句

如果你好好学习,校招时拿一个好offer,走上人生巅峰。
如果你不学习,毕业等于失业,回家卖红薯。
这就是选择!

代码演示:

int main(){int input = 0;printf("计算机学习课\n");printf("你打算好好学习吗?(1/0):");scanf("%d", &input);//1 / 0 if (input == 1){printf("好offer\n");}else{printf("卖红薯\n");}return 0;}

七.循环语句

有些事必须一直做,比如我日复一日的讲课,比如大家,日复一日的学习。
还比如:

C语言中如何实现循环呢?

  • while语句
  • for语句
  • do … while语句
    //while语句代码实现:
#include int main(){printf("加入好好学习\n");int line = 0;while (line <= 20000){line++;printf("我要继续努力敲代码\n");}if (line > 20000)printf("好offer\n");return 0;}

八. 函数

//函数声明int Add(int x, int y);int main(){int a = 0;int b = 0;int s = 0;scanf("%d %d", &a, &b);//求和//s = a + b;//...s = Add(a, b);//函数调用printf("%d\n", s);return 0;}////函数的定义int Add(int x, int y){int z = x + y;return z;}
  • 函数的特点就是简化代码,代码复用
  • 先声明后使用,定义也是一种声明
  • 一个过程中可以有多个.c文件,但多个.c文件只能由一个main函数

九.数组

要存储1-10的数字,怎么存储?
C语言中给了数组的定义:一组相同类型元素的集合

9.1 数组定义

int arr[5] = { 1,2,3,4,5 };//定义一个整型数组,最多放五个元素
int arr1[30] = { 1,2,3,4,5,6,7,8,9,10 };//不完全初始化,剩余元素默认初始化为0

9.2 数组的下标

C语言规定:数组的每个元素都有一个下标,下标是从0开始的
数组可以通过下标来访问的。
比如:

int main(){int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//0 1 2 3 4 5 6 7 8 9printf("%d\n", arr[7]);arr[7] = 18;printf("%d\n", arr[7]);return 0;}

运行结果:

9.3 数组的使用

int main(){int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//0 1 2 3 4 5 6 7 8 9int i = 0;while (i < 10){printf("%d ", arr[i]);i = i + 1;}return 0;}

运行结果:

十.操作符

  • 算数操作符
int main(){printf("%d\n", 17 / 4);//4...1/ -除法-得到是商printf("%d\n", 17 % 4);//4...1% -取余/取模 - 得到是余数printf("%.2lf\n", 17.0 / 4);//doubleprintf("%lf\n", 17 / 4.0);//doubleprintf("%lf\n", 17.0 / 4.0);//double//直接写出的浮点数,会被编译器识别为double类型printf("%.2f\n", 17.0f / 4);//float .2表示保留两位有效数字return 0;}

%两边必须是整数
直接写出的浮点数会被编译器识别为double

  • 移位操作符

移动的是二进制的位

  • 位操作符

使用二进制位计算

  • 赋值操作符

a = a + 5—–a += 5
赋值操作符
局部变量不初始化的情况下里面放的是随机值(int a = 0/int a)

  • 单目操作符(只有一个操作数的操作符)

C语言中,0表示假,非0表示真


sizeof 操作数的类型长度(以字节为单位)

++ 前置++,后置++
前置–,后置–
(++与- -口诀相同)

(类型) 强制类型转换

结构体的信息->int 无法转换

  • 关系操作符
  • 逻辑操作符

&&=并且 有假则假,全真为真
||=或者 有真则真,全假为假

代码案例:

int main(){//3~5月是春天int month = 0;scanf("%d", &month);//if (3 <= month <= 5)//错误含义if(month>=3 && month<=5)printf("春天\n");return 0;}//12 1 2 月是冬天int main(){int month = 0;scanf("%d", &month);if (month == 12 || month == 1 || month == 2)printf("冬天\n");}
  • 条件操作符

  • 逗号表达式
    exp1,exp2,exp3,…expN

从左向右依次计算,整个表达式的结果是最后一个的计算结果

  • 下标引用,函数调用和结构成员
int main(){int arr[10] = { 1,2,3,4,5 };printf("%d\n", arr[4]);//[] 下标引用操作符return 0;}int Add(int x, int y){return x + y;}int main(){int z = Add(3, 5);//()函数调用操作符,Add,3,5 是()的操作数return 0;}

十一.常见关键字

11.1 关键字 typedef

typedef 顾名思义是类型定义,这里应该理解为类型重命名。

typedef unsigned int uint;typedef int INT;int main(){unsigned int num = 0;uint num2=0;INT num3 = 0;int num4 = 0;return 0;}

11.2 关键字static

在C语言中:
static是用来修饰变量和函数的

  1. 修饰局部变量-称为静态局部变量
  2. 修饰全局变量-称为静态全局变量
  3. 修饰函数-称为静态函数
11.2.1 修饰局部变量

案例一:

案例二:

  • 这时局部变量就是静态的局部变量
  • 一个普通的局部变量进入函数创建,出函数销毁
  • 但是被static修饰之后,进入函数时已经创建好了,出函数的时候也不销毁,多次调用函数时,共享一个变量
  • 主管的感受:生命周期变长了,但是作用域不变,只能在局部范围内使用
  • 本质是:普通的局部变量是放在栈区上的,但是被static修饰后,是存放在内存的静态区的,静态区的变量生命周期和全局变量的生命周期一样
11.2.2 修饰全局变量

案例一:

案例二:

全局变量是具有外部链接属性,这种属性决定了全局变量在多个文件之间可以互相使用
static修饰全局变量的时候,将外部链接属性变成了内部链接属性
g_val只能在当前的.c文件内部使用,不能在其他的.c文件中使用了
给我们的感受:改变了作用域

11.2.3 修饰函数

案例一:

案例二:

函数也是具有外部链接属性的,这种属性决定了函数是可以跨文件使用的
static修饰函数是把函数的外部链接属性改成了内部链接属性
使得函数只能在自己所在的.c文件中使用

补:
栈区,堆区,静态区

十二.#define定义常量和宏

  • #define 定义的标识符常量

  • #define 定义宏

十三.指针

13.1 内存

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。

int main(){int a = 10;//& - 取地址操作符int * pa = &a;//0x0012ff48-内存的编号==地址==指针, pa叫指针变量//* 是在说明pa是指针变量//int 是在说明pa指向的是int类型的变量*pa = 20;//* 解引用操作符 - 通过地址找到地址所指向的对象。*pa就等价于aprintf("%d\n", a);return 0;}

总结:1. 内存会被划分以字节为单位的一个个的内存单元
2. 每个内存单元都有编号,编号 =地址=指针
3. C语言中创建的变量,其实是向内存申请一块空间,比如:int a = 10,就是向内存申请4个字节的空间,每个字节都有地址
4. &a的时候,拿出的是4个字节中地址较小的那个字节的地址(编号)
5. 这个地址要存储起来,给一个变量,这个变量是用来存放地址(指针)所以叫指针变量:int *pa = &a;
6. pa中存放的是a的地址,要通过pa中的地址找到a,怎么写?*pa–> 通过pa中的地址找到a *pa = 20;//本质是修改a

13.2 指针变量的大小


补:

十四.结构体

结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。
比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。
这里只能使用结构体来描述了。

//学生//学生类型//intstruct Stu{char name[20];int age;float score;};int main(){int num;struct Stu s1 = {"张三", 20, 88.0f};struct Stu s2 = {"李四", 18, 65.5f};struct Stu s3 = {"王五", 19, 99.8f};struct Stu * ps1 = &s1;printf("%s %d %f\n", ps1->name, ps1->age, ps1->score);//printf("%s %d %f\n", s1.name, s1.age, s1.score);//printf("%s %d %f\n", s2.name, s2.age, s2.score);//printf("%s %d %f\n", s3.name, s3.age, s3.score);//结构体变量.结构体成员//结构体指针->结构体成员return 0;}

不知不觉,初识C语言以告一段落。通读全文的你肯定收获满满,让我们继续为C语言学习共同奋进。 最后将我最喜欢作家的一句话送给大家:
———我爱我自己这一团凝结的,坚实的思想。这是我生命的支点