0
点赞
收藏
分享

微信扫一扫

狂肝数天,万字文章带你保姆级重识c语言(有我足以)

蒸熟的土豆 2022-04-26 阅读 31

今天带大家重识C语言,一片文章领悟C语言精髓

文章目录

如何学好C语言

1.激励自己,树立信心

学习不能叫苦叫累,抱怨没时间

  • 欲戴王冠,必承其重
  • 如果你总是和别人走一样的路怎么才能保证超越别人,那就得付出不一样的努力
  • 时间就像海绵里的水,挤一挤总会有的

3.拒绝做伸手党

  • 遇到问题,先自己尝试解决!

4.学好编程,不仅仅是学好C语言

必须学好:

学习语言:

选择一门好的语言,深入学习,完成所有的课后作业,多刷题巩固

学习算法,数据结构

课堂以听为主,课下多练习,多刷题

学习操作系统和网络

认真听讲+课后练习+主动学习
明确学校所学的知识并不能达到就业基础,必须深入学习,互联网从来不缺知识,缺少的是你去探索的心❤


首先带大家全面了解一下C语言全体系知识网络图在这里插入图片描述

初识C语言

本章目标

本章重点

  • 什么是C语言
  • 第一个C语言程序
  • 数据类型
  • 变量,常量
  • 字符串+转义字符+注释
  • 选择语句
  • 循环语句
  • 函数
  • 数组
  • 操作符
  • 常见关键字
  • define 定义常量和宏
  • 指针
  • 结构体

什么是C语言

1.第一个C语言程序:

// 包含一个叫stdio.h的文件
//std-标准 standard input output
#include"stdio.h"
int main()//主函数-程序的入口-main函数有且只有一个
{
	//这里完成任务
	// 在屏幕输出helloworld
	// 函数-print(打印) function- printf-打印函数
	//printf("helloworld\n");

	//库函数-C语言本身提供我们使用的函数
	//#include
	return 0;
}
/*
int 是整型的意思
main前面的int 表示main函数调用返回一个整型值
int main()
{
return 0;   //返回0
}

     void main() 写法已将过时
*/

2.数据类型:

代码练习:

int main()
{
	//%d-打印整型
	//%c--打印字符
	//%f--打印浮点数--小数
	//%p--以地址的形式打印
	//%x--打印16进制数据
	//....
	char ch = 'A';
	//char-字符类型
	// int --整型
	// long -- 长整型
	long num = 100;
	printf("%d", num);
	float f = 5.0;
	printf("%f", f);
	//short int  --短整型
	printf("%c\n", ch);  //%c--打印字符格式的数据
	int age = 20;
	printf("%d", age);   //%d--打印整型十进制数据
	double b = 3.14;
	printf("%lf\n", b);//打印双精度浮点型
	return 0;
	
}

在这里插入图片描述
在这里插入图片描述

3.变量,常量:

生活中的有些值是不变的(比如:身份证,性别,姓名等等)
有些值是改变的(如:年龄,体重,身高…)

不变的值,C语言中用常量的概念来表示,变得值C语言中用变量来表示

定义变量的方法

int age = 20;
	float weight = 90.5f;
	char ch = 'w';

变量的分类

  • 局部变量
  • 全局变量
#include"stdio.h"
int a = 100;//全局变量
int main()
{
	//局部变量和全局变量的名字建议不要相同-易产生bug
	//当局部变量和全局变量的名字相同时,局部变量优先
	int a = 10;//局部变量
	printf("%d\n", a);
	return 0;
}

总结:
局部变量可与全局变量同名当局部变量量和全局变量同名时局部变量优先使用

变量的使用

计算两个数的和:

int main()
{
	//计算两个数的和
	int num1 = 0;
	int num2 = 0;
	//输入数据-使用输入函数scanf
	scanf_s("%d%d", &num1, &num2);//取地址符&
	//C语言语法规定先定义再使用
	int sum = num1 + num2;
	printf("sum=%d\n", sum);
	return 0;

}

—·

变量的作用域和生命周期

作用域

1.局部变量的作用域是变量所在的范围
2.全局变量的作用域是整个工程


生命周期

  • 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
  • 全局变量的生命周期:整个程序的生命周期

常量

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

  • 字面常量
  • const 修饰的常量
  • #define定义的表示符常量
  • 枚举常量
#include"stdio.h"
//#define定义的标识符常量
#define MAX 10
enum Sex
{
	MALE,
	FEMALE,
	SECRET,
};
int main()
//枚举常量
//枚举--一一列举
//例:性别,星期...
//枚举关键字: enum

//enum Sex s = MALE;
{
	enum Sex s = MALE;

	//const--常变量
	const int n = 10;//n是变量但又有常属性,所以我们的n常变量
	int arr[n] = { 0 };
	//consout--修饰的常变量
	//int num = 8;
	const int num = 8;
	
	printf("%d\n", num);
	num = 10;
	printf("%d\n", num);
	return 0;
}

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

字符串

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

//int float
//char
//字符串类型
int main()
{
	char arr1[] = "abc";//数组
	char arr2[] = { 'a','b','c' };
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	return 0;
}

在这里插入图片描述

在这里插入图片描述

int main()
	{
	char arr1[] = "abc";
	char arr2[] = { 'a','b','c' };
	printf("%d\n", strlen(arr1));//strlen---string length-计算数组长度
	printf("%d\n", strlen(arr2));
	//输出:3 arr2->随机值(直到遇到'\0'字符串结束)
	return 0;
	}

数据在计算机上储存的时候,储存的是二进制
为了存储方便,引荐ASCII编码

ASCII编码表

在这里插入图片描述

转义字符

转变原来的意思

转义字符释义
\ ?在书写连续多个问号时使用,防止他们被解析成三个字母符
\ ’用于表示字符常量 ’
\ "用来表示字符串内部的双引号
\ \用来表示一个反斜杠,防止他被解释成一个转义序列字符
\a警告字符,蜂鸣
\b退格符
\f进纸符
\n换行
\r回车
\t水平制表符
\v垂直制表符
\dddddd表示1-3个八进制的数字。如:\130X
\xdddd表示2个十六进制数字。如:\x30 0

注释

  • 代码中有不需要的代码可以直接删掉,也可以注释掉
  • 代码中有些代码比较难懂,可以加一些注释文字

5.选择语句

如果什么什么,怎么样。。。
如果什么什么,又怎么样。。。
在这里插入图片描述

6.函数

int Add(int x, int y)
{
	int z = x + y;
	return z;
}
int main()
{
	
	int a=10, b=20;
	int sum=0;
	sum = Add(a,b);
	printf("sum=%d\n", sum);
	return 0;
}

函数的特点就是简化代码,代码复用

7.数组

C语言中数组的定义:一组相同类型的元素的集合

数组定义

数组的使用

通过下表来使用

8.操作符

算数操作符

移位操作符(移(二进制)位操作符)
>> (右移) <<()左移)
位操作符
&(按位与) ^ |(按位或)
赋值操作符
= += -= *= /= &= ^= |= >>= <<=

单目操作符

符号解释
逻辑反操作
-负值
+正值
&取地址
sizeof操作数的类型长度(以字节为单位)
~对一个数的二进制按位取反
前置、后置–
++qianzhi、后置++
*间接访问位操作符
(类型)强制类型转换
int main()
{
	int a = 11;
	//sizeof计算的是变量/类型所占空间的大小,单位是字节
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof a);

	printf("%d\n", sizeof(int));

	
	return 0;

}

在这里插入图片描述

条件操作符

exp1 ? exp2 : exp3
逗号表达式
exp1, ? exp 2 ,? exp3,…expN
下标引用,函数调用和结构成员
[ ] () . ->

9.常见关键字

关键字说明
auto声明自动变量
short声明短整型变量或函数
int声明整型变量或函数
long声明长整型变量或函数
float声明浮点型变量或函数
doubl声明双精度变量或函数
char声明字符型变量或函数
struct声明结构体变量或函数
union声明共用数据类型
enum声明枚举类型
typedef用以给数据类型取别名
const声明只读变量
unsigned声明无符号类型变量或函数
signed声明有符号类型变量或函数
extern声明变量是在其他文件正声明
register声明寄存器变量
static声明静态变量
volatile说明变量在程序执行中可被隐含地改变
void声明函数无返回值或无参数,声明无类型指针
if条件语句
else条件语句否定分支(与 if 连用)
switch用于开关语句
case开关语句分支
for一种循环语句
do循环语句的循环体
while循环语句的循环条件
goto无条件跳转语句
continue结束当前循环,开始下一轮循环
break跳出当前循环
default开关语句中的“其他”分支
sizeof计算数据类型长度
return子程序返回语句(可以带参数,也可不带参数)循环条件

改变了变量的作用域—让静态的全局变量只能在自己所在的源文件内部使用,除了源文件就无法使用,static修饰函数

define定义常量和宏

//define 定义标识符常量
#define   MAX   100
//define 定义宏
#define     ADD(x,y)((x)+(y))
# include"stdio.h"
int main()
{
return 0;
}

在这里插入图片描述

10.指针

指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。
由于内存中的每一个字节都有一个唯一的编号,因此,在程序中使用的变量,常量,甚至数函数等数据,当他们被载入到内存中后,都有自己唯一的一个编号,这个编号就是这个数据的地址。指针就是这样形成的。

#include <stdio.h>

int main(void)
{
    char ch = 'a';
    int  num = 97;
    printf("ch 的地址:%p
",&ch);   //ch 的地址:0028FF47
    printf("num的地址:%p
",&num);  //num的地址:0028FF40
    return 0;
}

变量和内存

定义指针变量

C语言中,定义变量时,在变量名 前 写一个 * 星号,这个变量就变成了对应变量类型的指针变量。必要时要加( ) 来避免优先级的问题。

引申:C语言中,定义变量时,在定义的最前面写上typedef ,那么这个变量名就成了一种类型,即这个类型的同义词。

int a ; //int类型变量 a
int *a ; //int* 变量a
int arr[3]; //arr是包含3个int元素的数组
int (* arr )[3]; //arr是一个指向包含3个int元素的数组的指针变量


//-----------------各种类型的指针------------------------------

int* p_int; //指向int类型变量的指针 

double* p_double; //指向idouble类型变量的指针 

struct Student *p_struct; //结构体类型的指针

int(*p_func)(int,int); //指向返回类型为int,有2个int形参的函数的指针 

int(*p_arr)[3]; //指向含有3个int元素的数组的指针 

int** p_pointer; //指向 一个整形变量指针的指针

取地址

既然有了指针变量,那就得让他保存其它变量的地址,使用& 运算符取得一个变量的地址。

int add(int a , int b)
{
    return a + b;
}

int main(void)
{
    int num = 97;
    float score = 10.00F;
    int arr[3] = {1,2,3};

    //-----------------------

    int* p_num = &num;
    float* p_score = &score;
    int (*p_arr)[3] = &arr;           
    int (*fp_add)(int ,int )  = add;  //p_add是指向函数add的函数指针
    return 0;
}

指针之间的赋值

指针赋值和int变量赋值一样,就是将地址的值拷贝给另外一个。指针之间的赋值是一种浅拷贝,是在多个编程单元之间共享内存数据的高效的方法。

int* p1  = & num;
int* p3 = p1;

//通过指针 p1 、 p3 都可以对内存数据 num 进行读写,如果2个函数分别使用了p1 和p3,那么这2个函数就共享了数据num。

空指针

空指针

指向空,或者说不指向任何东西。在C语言中,我们让指针变量赋值为NULL表示一个空指针,而C语言中,NULL实质是 ((void*)0) , 在C++中,NULL实质是0。

换种说法:任何程序数据都不会存储在地址为0的内存块中,它是被操作系统预留的内存块。

#ifdef __cplusplus
     #define NULL    0
#else    
     #define NULL    ((void *)0)
#endif


坏指针

指针变量的值是NULL,或者未知的地址值,或者是当前应用程序不可访问的地址值,这样的指针就是坏指针,不能对他们做解指针操作,否则程序会出现运行时错误,导致程序意外终止。

结构体和指针

结构体指针有特殊的语法: -> 符号

如果p是一个结构体指针,则可以使用 p ->【成员】 的方法访问结构体的成员

任何一个指针变量在做 解地址操作前,都必须保证它指向的是有效的,可用的内存块,否则就会出错。坏指针是造成C语言Bug的最频繁的原因之一。

typedef struct
{
    char name[31];
    int age;
    float score;
}Student;

int main(void)
{
    Student stu = {"Bob" , 19, 98.0};
    Student*ps = &stu;

    ps->age = 20;
    ps->score = 99.0;
    printf("name:%s age:%d
",ps->name,ps->age);
    return 0;
}

指针的2个重要属性

指针也是一种数据,指针变量也是一种变量,因此指针 这种数据也符合前面 变量和内存 主题中的特性。 这里我只想强调2个属性: 指针的类型,指针的值。

数组和指针

1、数组名作为右值的时候,就是第一个元素的地址。

int main(void)
{
    int arr[3] = {1,2,3};

    int*p_first = arr;
    printf("%d
",*p_first);  //1
    return 0;
}

函数和指针

函数的指针

每一个函数本身也是一种程序数据,一个函数包含了多条执行语句,它被编译后,实质上是多条机器指令的合集。在程序载入到内存后,函数的机器指令存放在一个特定的逻辑区域:代码区。既然是存放在内存中,那么函数也是有自己的指针的。

void echo(const char *msg)
{
    printf("%s",msg);
}
int main(void)
{
    void(*p)(const char*) = echo;   //函数指针变量指向echo这个函数

    p("Hello ");      //通过函数的指针p调用函数,等价于echo("Hello ")
    echo("World
");
    return 0;
}

在这里插入图片描述

在这里插入图片描述

举报

相关推荐

0 条评论