c语言0基础笔记

目录

前言

第01章_C语言入门

1.1初识计算机语言

1.2初识C语言

1.3第一个c程序

1.4IDE使用

1.5注释

1.6第一个c程序剖析

1.7printf()输出格式

第02章_变量与进制

2.1关键字

2.2标识符

2.3变量

2.4基本数据类型的使用

2.5变量间的运算规则

2.6常量

2.7输入/输出函数

2.8进制

第03章_运算符与流程控制

3.1运算符

3.2分支结构

3.3循环结构

3.4关键字break

3.5关键字continue

3.6关键字goto

第04章_数组

4.1数组的概述

4.2一维数组的使用

4.3一维数组的应用

4.4char数组与字符串

4.5二维数组的使用

第05章_指针

5.1指针的理解和定义

5.2指针的运算

5.3野指针

5.4多重指针

5.5指针与数组

第06章_函数

6.1函数的基本使用

6.2进一步认识函数

6.3参数传递机制

6.4函数的高级应用

6.5再谈变量

第07章_结构体与共用体

7.1结构体的基本使用

7.2进一步认识结构体

7.3结构体数组

7.4结构体指针

7.5结构体在数据结构中的应用

7.6共用体类型的使用

7.7typedef的使用

第08章_C语言常用函数

8.1字符串的表示

8.2字符串的常用函数

8.3字符串与基本数据类型的转化

8.4日期相关函数

8.5数学相关函数

8.6内存管理相关函数

第09章_文件操作

9.1文件和流

9.2c输入和输出

9.3c文件的读写


前言

根据b站视频课程编写的笔记

001.C语言课程介绍_哔哩哔哩_bilibili

第01章_C语言入门

1.1初识计算机语言

计算机编程语言 ,就是人与计算机交流的方式。人们可以使用
编程语言 对计算机下达 命令 ,让计算机完成人们需要的功能。
计算机语言有很多种。如: C C++ Java Go
JavaScript Python Scala 等。
语言 = 语法 + 逻辑

1.2初识C语言

C 语言最初是作为 Unix 系统的开发工具而发明的。
1969 年,美国贝尔实验室的肯 · 汤普森( Ken Thompson )与丹尼斯 ·
里奇( Dennis Ritchie )一起开发了 Unix 操作系统。 Unix 是用 汇编语
写的,依赖于计算机硬件。为了程序的 可读性 可移植性 ,他
们决定使用高级语言重写。但是,当时的高级语言无法满足他们的
要求,汤普森就在 BCPL 语言的基础上发明了 B 语言
1972 年,丹尼斯 · 里奇( Dennis Ritchie )在 B 语言的基础上重新设计
了一种新语言,这种新语言取代了 B 语言,称为 C 语言
1973 年, 整个 Unix 系统都使用 C 语言重写

1.3第一个c程序

1.编写代码

#include <stdio.h>              
int main()                 
{                              
    printf("hello,world!!\n");
   return 0;                  
}

2.安装编译器

目前,最常见的 C 语言编译器是自由软件基金会推出的 GCC 编译
,可以免费使用。 Linux Mac 系统可以直接安装 GCC
Windows 系统可以安装 MinGW
补充知识: MinGW GCC 的区别:
GCC 是一个跨平台的编译器集合,可用于多种操作系统和处理器
架构,包括 Windows ;而 MinGW GCC Windows 平台上的移植版
本,主要用于在 Windows 上本地编译 C C++ 代码。

3.编译&运行

gcc Hello.c

a.exe

GCC -o 参数( output 的缩写)可以指定编译产物的文件名。
> gcc -o Hello Hello.c
GCC - std= 参数 standard 的缩写)还可以指定按照哪个 C
言的标准进行编译。
上面命令指定按照 C99 标准进行编译。
> gcc -std=c99 Hello.c

1.4IDE使用

我的使用的是vscode,配置教程如下

VSCode配置C语言环境(详细教程)_c语言vscode配置-CSDN博客

1.5注释

C 语言中的注释类型:
单行注释
// 单行注释
多行注释 ( 或块注释 )
/*
  这是第一行注释
  这是第二行注释
  这是第三行注释
*/
/* 我是被注释的文字 */

1.6第一个c程序剖析

#include <stdio.h>              
int main()                 
{                              
    printf("Hello World\n");    
   return 0;                  
}
main()
int main(){}
每一个程序 ( 或工程 ) 可以定义很多函数 ( 后面讲 ) ,但有且只有一
main() 函数,作为程序执行的入口,在 main() 函数结尾结束整
个程序的运行。
空括号 () ,表示 main 不接受任何参数。
写在 main 之前的 “int” 称为关键字,代表数据类型是整型。它是
main() 的返回值类型。即在执行 main() 函数后会得到一个整型值
( 即函数值 )
C 语言约定: return 0 ,表示 main() 函数终止运行,且运行成
功;如果返回其它非零整数,就表示运行失败。默认情况下,如
main() 里面省略 return 0 这一行,编译器会自动加上,但
是为了保持统一的代码风格,不建议省略。
② 函数体
一对花括号 {} 定义了函数的主体,所有函数都必须以大括号开头
和结尾,成对出现。
C 程序中的函数体指的是作为该函数一部分的语句。它可以是任
何操作,比如搜索、排序、打印等。
每一个执行语句后面都会有一个英文分号 “;” 作为语句结束的标
志。
一行内可写几条语句,一条语句也可写在几行上。
printf()
printf() 函数是产生格式化输出的函数,作用是将参数文本输出到屏
幕。它名字里面的 f 代表 format ( 格式化 ) ,表示可以指定输出文本
的格式。
为了让光标移到下一行的开头,可以在输出文本的结尾,添加一个
换行符 \n
printf ( "Hello World" ); // 将字符串输出到控制台,行尾不换行
printf("Hello World\n");
④ 标准库、头文件
printf() 是在标准库的头文件 stdio.h 中定义的。要想在程序中使
用这个函数,必须在源文件头部引入这个头文件。即:
#include <stdio.h>
何为标准库?
程序需要用到的功能,不一定需要自己编写, C 语言可能已经自带
了。程序员只要去调用这些自带的功能就可以了。 C 语言自带的所
有这些功能,统称为 标准库 ”(standard library) ,包含 C
内置函数、常量和头文件。
因为它们是写入标准的,到底包括哪些功能,应该怎么使用,都是
规定好的,我们直接调用即可。
何为头文件?
不同的功能定义在不同的文件里,这些文件统称为 头文件
(header file) 。如果系统自带某一个功能,就一定会自带描述
这个功能的头文件,比如 printf() 的头文件就是系统自带的
stdio.h 。头文件的后缀通常是 .h
预处理命令: #include 命令
如果要使用某个功能,就必须先加载其对应的头文件,加载使用的
#include 命令,声明在各文件模块的开头。 C 语言中以 # 号开
头的命令称为 预处理命令 。顾名思义,在编译器对当前 C 程序进行
编译前执行预处理操作。
格式:
printf ( "Hello World\n" );
#include <stdio.h>
#include < 头文件名 >
举例:
#include <stdio.h>  
注意,加载头文件的 #include 语句不需要分号结尾
对比写法:
#include <stdio.h> // 编译系统在系统头文件所在目录搜索
#include "stdio.h" // 编译系统首先在当前的源文件目录中查找
stdio.h ,找不到的话,再转向系统头文件所在目录搜索。
stdio.h 是系统提供的一个文件名,
stdio standard input & output的缩写。
结论:
引用系统头文件,两种形式都会可以, #include <> 效率
高。
引用用户头文件,只能使用 #include ""
常用的 C 头文件
stdio.h —— 定义核心输入和输出函数
printf() scanf() getchar() putchar()
stdlib.h —— 定义数值转换函数、伪随机网络生成器和内存分
string.h —— 定义字符串处理函数
stdint.h —— 定义精确宽度的整数类型
math.h —— 定义常用的数学函数
sin() sqrt()
stddef.h —— 定义了几个有用的类型和宏

1.7printf()输出格式

printf(格式控制字符串,输出列表)

其中,
" 格式控制字符串 " 是用双引号括起来的一个字符串。包括:
普通字符:普通字符即需要在输出时原样输出的字符。
占位符:由 “%” 和格式字符组成。这个位置可以用其它值代
入。
" 输出列表 " 是程序需要输出的一些数据,可以是常量、变量或
表达式。用于替换占位符的位置。
注意:printf() 参数与占位符是一一对应关系。如果参数个数少于
对应的占位符, printf() 可能会输出内存中的任意值。
占位符
占位符的第一个字符是 % ,第二个字符表示占位符的类型。
printf() 的占位符有许多种类,与 C 语言的数据类型相对应。
下面按照字母顺序,列出占位符如下,方便查阅 ( 红色为常用的 )
%a :浮点数(仅C99有效) 
%A :浮点数(仅C99有效) 
%c :char型数据 
%d :十进制整数(int) 
%e :使用科学计数法的浮点数,指
数部分的 e 为小写 
%E :使用科学计数法的浮点数,指数部分的
E 为大写 
%i :整数,基本等同于 %d 
%f :浮点数(float) 
%g :6个有效数字的浮点数。整数部分一旦超过6位,就会自动转为科
学计数法,指数部分的 e 为小写 
%G :等同于 %g ,唯一的区别是指数部分的 E 为大写 
%hd :十进制 short int 类型 
%ho :八进制 short int 类型
%hx :十六进制 short int 类型 
%hu :unsigned short int 类型
%ld :十进制整数(long) 
%lo :八进制 long int 类型 
%lx :十六进制 long int 类型 
%lu :unsigned long int 类型
%lld :十进制 long long int 类型 
%llo :八进制 long long int 类型
%llx :十六进制 long long int 类型 
%llu :unsigned long long int类型 
%le :科学计数法表示的 long double 类型浮点数 
%lf :十进制浮点数(double) 
%n :已输出的字符串数量。该占位符本身不输出,只将值存储在指定变量之中 
%o :八进制整数 
%p :指针 
%s :字符串 
%u :十进制无符号整数(unsigned int) 
%x :十六进制整数 %zd : size_t 类型 
%% :输出一个百分号
输出格式
printf() 可以定制占位符的输出格式。
格式 1 :限定宽度
printf() 允许限定占位符的最小宽度。
printf("%5d\n", 123); // 输出为 " 123"
说明: %5d 表示这个占位符的宽度至少为 5 位。如果不满 5 位,对应
的值的前面会添加空格。
输出的值默认是右对齐,即输出内容前面会有空格;如果希望改成
左对齐,在输出内容后面添加空格,可以在占位符的 % 的后面插入
一个 - 号。
printf("%-5d\n", 123); // 输出为 "123 "
对于小数,这个限定符会限制所有数字的最小显示宽度
printf("%12f\n", 123.45); // 输出 " 123.450000"
%12f 表示输出的浮点数最少要占据 12 位。由于小数的默认显示精度
是小数点后 6 位,所以 123.45 输出结果的头部会添加 2 个空格。
格式 2 :总是显示正负号
默认情况下, printf() 不对正数显示 + 号,只对负数显示 - 号。如果
想让正数也输出 + 号,可以在占位符的 % 后面加一个 +
printf("%+d\n", 11); // 输出 +11
printf("%+d\n", -11); // 输出 -11
格式 3 :限定小数位数
输出小数时,有时希望限定小数的位数。举例来说,希望小数点后
面只保留两位,占位符可以写成 %.2f
printf ( "Number is %.2f\n" , 0.8 ); // 输出 Number is 0.80
这种写法可以与限定宽度占位符,结合使用。
printf ( "%6.2f\n" , 0.8 ); // 输出为 " 0.80"
说明: %6.2f 表示输出字符串最小宽度为 6 ,小数位数为 2 。整体长度
不足 6 位时,右对齐显示。
最小宽度和小数位数这两个限定值,都可以用 * 代替,通过 printf()
的参数传入。
printf("%*.*f\n", 6, 2, 0.8);
//等同于
printf("%6.2f\n", 0.8)

第02章_变量与进制

2.1关键字

2.2标识符

2.3变量

2.4基本数据类型的使用

2.5变量间的运算规则

2.6常量

2.7输入/输出函数

2.8进制

第03章_运算符与流程控制

3.1运算符

3.2分支结构

3.3循环结构

3.4关键字break

3.5关键字continue

3.6关键字goto

第04章_数组

4.1数组的概述

4.2一维数组的使用

4.3一维数组的应用

4.4char数组与字符串

4.5二维数组的使用

第05章_指针

5.1指针的理解和定义

计算机中程序的运行都是在内存中进行的,变量也是在内存中分配
的空间,且不同类型的变量占用不同大小的空间。那如何访问内存
中变量存储的数据呢?有两种方式: 直接访问 间接访问 。直接
访问,直接使用变量名进行的访问,以前的程序中都是采用这种方 式。
int num1 = 10;
int num2 = 20;
int num3 = num1 + num2;
间接访问,通过指针来实现。下面看如何理解指针。
为了能够有效的访问到内存的每个单元 ( 即一个字节 ) ,就给内存单元
进行了编号,这些编号被称为该 内存单元的地址 。因为每个内存单
元都有地址,所以变量存储的数据也是有地址的。
通过地址能找到所需的变量单元,可以说, 地址指向该变量单元
地址形象化地称为 指针 。即:
变量 :命名的内存空间,用于存放各种类型的数据。
变量名 :变量名是给内存空间取的一个容易记忆的名字。
变量值 :在变量单元中存放的数据值。
变量的地址 :变量所使用的内存空间的地址,即 指针
  • 指针变量:一个变量专门用来存放另一变量在内存中数据的地址 (即指针),则它称为“指针变量”。我们可以通过访问指针变量达到访问内存中另一个变量数据的目的。(有时为了阐述方便,将指针变量直接说成指针。)

上图中,地址0x00000001是变量 i 的指针,i_pointer就是一个指针变量。

体会:指针就是内存地址,使用指针访问变量,就是直接对内存地址中的数据进行操作。

指针变量的定义

一般格式:

数据类型 *指针变量名 [=初始地址值];
  • 数据类型是指针变量所指向变量数据类型。可以是 int、char、float 等基本类型,也可以是数组等构造类型。

  • 字符 * 用于告知系统这里定义的是一个指针变量,通常跟在类型关键字的后面。比如, char * 表示一个指向字符的指针, float * 表示一个指向 float 类型的值的指针。此外,还有指向数组的指针、指向结构体的指针。

举例1:

int *p;  //读作:指向int的指针”或简称“int指针”

这是一个指针变量,用于存储int型的整数在内存空间中数据的地址。

变形写法:

int* p;
int * p;

注意:

1、指针变量的名字是 p,不是*p。

2、指针变量中只能存放地址,不要将一个整数(或任何其它非地址类型的数据)赋给一个指针变量。

举例2:同一行声明两个指针变量

// 正确
int * a, * b;
// 错误
int* a, b;   //此时a是整数指针变量,而b是整数变量

举例3:一个指针指向的可能还是指针,这时就要用两个星号 ** 表示。(后面讲)

int **foo;

指针的应用场景

场景1:使用指针访问变量或数组的元素。

场景2:应用在数据结构中。比如:

5.2指针的运算

指针作为一种特殊的数据类型可以参与运算,但与其他数据类型不同的是,指针的运算都是针对内存中的地址来实现的。

取址运算符:&

取址运算符,使用“&”符号来表示。作用:取出指定变量在内存中的地址,其语法格式如下:

&变量

举例1:

int num = 10; 
printf("num = %d\n", num); // 输出变量的值。 num = 10
printf("&num = %p\n", &num); // 输出变量的内存地址。&num = 00000050593ffbbc

说明:

1、在输出取址运算获得的地址时,需要使用“%p”作为格式输出符。

2、这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)。

举例2:将变量的地址赋值给指针变量

int num = 10;
int *p; //p为一个整型指针变量
p = &num; 

举例3:

int d = 10;
int *e, *f;
e = &d;
f = e;

指针变量的赋值

1、指针变量中只能存放地址(指针),不要将一个整数(或任何其它非地址类型的数据)赋给一个指针变量。

2、C语言中的地址包括位置信息(内存编号,或称纯地址)和它所指向的数据的类型信息,即它是“带类型的地址”。所以,一个指针变量只能指向同一个类型的变量,不能抛开类型随意赋值。

  • char* 类型的指针是为了存放 char 类型变量的地址。

  • short* 类型的指针是为了存放 short 类型变量的地址。

  • int* 类型的指针是为了存放 int 类型变量的地址。

3、在没有对指针变量赋值时,指针变量的值是不确定的,可能系统会分配一个未知的地址,此时使用此指针变量可能会导致不可预料的后果甚至是系统崩溃。为了避免这个问题,通常给指针变量赋初始值为0(或NULL),并把值为0的指针变量称为空指针变量

举例4:通过指针变量修改指向的内存中的数据

int main() {

    int num = 10, *ptr;
    ptr = &num;
    printf("%d\n",num);

    scanf("%d", ptr); //等价于scanf("%d", &num);
    
    printf("%d\n",num);

    return 0;
}

5.3野指针

5.4多重指针

5.5指针与数组

第06章_函数

6.1函数的基本使用

6.2进一步认识函数

6.3参数传递机制

6.4函数的高级应用

6.5再谈变量

第07章_结构体与共用体

7.1结构体的基本使用

7.2进一步认识结构体

7.3结构体数组

7.4结构体指针

7.5结构体在数据结构中的应用

7.6共用体类型的使用

7.7typedef的使用

第08章_C语言常用函数

8.1字符串的表示

8.2字符串的常用函数

8.3字符串与基本数据类型的转化

8.4日期相关函数

8.5数学相关函数

8.6内存管理相关函数

第09章_文件操作

9.1文件和流

9.2c输入和输出

9.3c文件的读写

  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值