【C语言】初步认识C语言(上万字总结!)(建议收藏!!!)

大家初入大学可能对C语言这一门学科可能有些迷茫,为了使咱们能够对C语言有一个大致的了解,那么接下来将以下方面介绍C语言:

一 .什么是C语言。

        像汉语,英语等语言其实就为人与人交流的语言,那么我们步入计算机领域,与计算机也需要交流。因此例如 C语言 / Python / Java语言等,即为人与计算机交流的语言。

        C语言是一门通用计算机编程语言,且广泛用于底层开发。底层:

应用软件(QQ,网盘...)上层软件

底层软件

操作系统(windows,Linux,max...)
驱动
电脑----硬件

二 .第一个C语言程序。

1.写前必备

书写C语言程序首先需要构建C语言编程环境,为了大家更方便将时间花费在C语言学习的过程中,C语言程序安装包在以下链接中。

Visual Studio 2022 下载: 

链接:https://pan.baidu.com/s/1l5BxZbCldMJJ3WLEA_3_XQ?pwd=vuac 
提取码:vuac  

打开 VS2022 软件:

项目名称:给你的C语言文件项目命名(俗称)

位置:一定要保证你能在电脑上找到你书写的C语言文件

最后给你的C语言代码文件命名,将 .cpp 改为 .c ( .cpp是C++的文件后缀,.c为C语言的文件后缀)

2.书写程序

a. 写程序

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

b. 运行程序

c. 分析程序

为了大家更好地理解代码,先举出一个地下停车库的例子:地下停车库有入口(main),出口(return)。停车库内有公共车位(不需要告诉别人就可使用)和私人车位(必须告诉别人,别人知道你使用了之后你才可使用)。从入口处进入会得到一个牌子( int型 ),走过出口时(return)需将牌子(0)还给停车库主人。

int main():作为程序的入口,程序最开始运行的地方,并且一个工程有且只有一个 main 函数,main函数后有一个 {} ,将所写的代码放入 {}中。

printf(" "):printf 意思为打印,输出,即从程序中向电脑屏幕上打印出来,为 printf 函数,是一个“私人车位”,故使用时需要“告诉别人”,即为声明。这个“别人”为 <stdio.h>。#include 先不做深入了解。

return:程序的出口,返回值为0(int 型)

三 .数据类型。

1.计算机基本单位

学习数据类型首先需要明白计算机的基本单位:

        因为计算机接收的数据总是二进制的,用   bit(比特位)来表示一个二进制单元,即   bit 只能存储 1/0 两种数字。依次比 bit 位大为  byte(字节)KB   MB   GB   TB  ....

byte        字节                1 byte = 8 bit        11111111 - > 1byte大小
KB         千字节              1 KB = 1024 byte
MB         兆                    1 MB = 1024 KB
GB         吉                     1 GB = 1024 MB
TB  .......

2.数据类型

        C语言数据类型大致可以分为三种:1.字符型;2.整形;3.浮点型(小数)

字符型:char        eg: a  b  c  #   @   ...

整形 :short ( 短整型 );int(整形);long(长整型);long long(长长整形)

浮点型:float(单精度浮点数);double(双精度浮点数)[ 区别:双精度比单精度更精确一些 ]

3.数据类型大小

整形和浮点型分多种的原因其类型的大小不同:

        sizeof 是一个操作符,用来计算类型和变量的大小(单位是字节)。(sizeof 此处不做理解,了解即可)

即可看出:char 类型的大小是1个字节,short型大小为2个字节,int 型大小为4个字节,等等。此处虽然int 和 long 的大小都为4个字节,但是C语言标准规定,sizeof(long) >=sizeof(int) ,此处打印是按照相等打印的。

4.数据类型大概范围

因为计算机接收程序接收的都是二进制,1个字节 = 8个bit,一个bit有1/0两种可能,所以1个字节的大小可以达到 2的8次方,2个字节的大小可以达到2的16次方...

类型大小(字节)范围
char1-2的7次方 ~ 2的7次方-1
short2-2的15次方 ~ 2的15次方-1
int4-2的31次方 ~ 2的31次方-1
long4-2的31次方 ~ 2的31次方-1
long long8-2的63次方 ~ 2的63次方-1
float4-2的31次方 ~ 2的31次方-1
double8-2的63次方 ~ 2的63次方-1

5.数据类型的打印

类型打印形式
char%c
short%hd
int%d
long%ld
long long%lld
float%f
double%llf

此处 \n 以为打印后换行,此处不做深入。

四 .变量与常量。

1.变量

用来描述变化的量。可以被修改的量,变量分为局部变量和全局变量。

        全局变量:所有程序中 {} 之外定义的变量。

        局部变量:在 {} 之内定义的变量,并且在一个{}内定义的变量,在另一个 {} 内无法使用。

        其中,b为全局变量,a为局部变量。

当全局变量和局部变量赋值不同是,以局部变量优先。

2.常量

用来描述不变的量,并且不可被修改。

在C语言中,通常情况下,一个 = 表示赋值,两个 = (即 ==)表示等于。一个 = 表示的量为变量,两个 = 表示的量为常量。

常量分为四种:字面常量,const 修饰的常变量,#define 定义的标识符常量,枚举常量(enum)

        字面常量:写在程序中的1,2,3...

        const修饰的常变量:const int n=10 等价为 n==10。不过此时 n虽然不可被修改,但是 n本质上仍然是一个变量,它只是具有了常属性。

        #define 修饰的标识符常量: eg:#define PI 3.14    PI作为一个标识符,代表的值是3.14,并不是赋值3.14。它只是3.14的另一种描述形式。

        枚举常量:枚举就是一一列举,是C语言提供的一种自定义类型的方法。

#include<stdio.h>
enum sex
{
    male,        // 0
    female,      // 1
    secret       // 2
};
int main()
{
    printf("%d\n",male);
    printf("%d\n",female);
    printf("%d\n",secret);
    return 0;
}

运行结果:

因为枚举即为一一列举,从 male 开始依次增加1(male 初始值为0)。若将male初始值赋为3,则:

3.作用域

        通常说,一段程序代码中所用到的名字并不总是可用的,而限定这个名字的可用性代码范围即是这个名字的作用域(俗讲:这个变量哪里可以使用,哪里就是它的作用域)

局部变量作用域:局部变量所在的局部范围(若一个变量在{}内被定义,那么这个{}内范围即是这个变量的作用域)。

全局变量作用域:整个工程。(目前不做深入理解)

4.生命周期

        变量的创建到变量的销毁之间的一个时间段。(即: 变量创建  ->    }-> 变量销毁),在一个 {}之间,{  代表变量的创建,  }  代表变量的销毁。

局部变量生命周期:进作用域生命周期开始,出作用域生命周期结束。

全局变量生命周期:整个程序的生命周期。

五 .字符串,转义字符和注释。

1.字符串

        有双引号引起来的一串字符。字符串结束标志是 '\0' 的转义字符,并且在计算字符串长度时 '\0' 是结束标志,不能算作字符串内容。另外,字符串的打印形式是 %s  

目前先掌握书写字符串的两种形式: eg:char   arr[]="abcdef";   char  arr2[]={'a','b','c','d','e','f','\0'};

通过右边的调试检测可知:形式1中字符串后面自带一个转义字符 '\0' 作为字符串的结束标志;形式2中在书写字符串时需手动加上一个 '\0' 作为结束标志。

2.转义字符

转义:就是转变它原本的意思。

转义字符功能
\0结束标志
\'用于打印  '
\''用于打印  ''
\\用于打印  \
\a警告符号,有蜂鸣声
\b退格符
\r回车符
\t水平制表符,相当于 Tab键
\v垂直制表符
\ddd

ddd表示1~3个八进制数字,例如 \123 (123转换成10进制是88)

88在ASCII码表上表示的字符是 X

\xdddd表示2个十六进制数字,例如 \30(30转换成十六进制是48),48在ASCII码表上表示的字符是 0

对于 \ddd 和 \xdd,首先需要了解进制的转换:二进制,八进制,十进制,十六进制

        eg:数字15

        二进制 1111   -->  右边第一位 1*2的0次方 + 右边第二位 1*2的1次方 + 右边第三位 1*2的2次方 + 右边第四位 1*2的3次方 =15

        八进制 17      -->右边第一位 7*8的0次方 + 右边第二位 1*8的1次方

        十进制  15

        十六进制  F   --->  对于十六进制,1~15的表示形式:1 2 3 4 5 6 7 8 9 A B C D E F  (A:10,B:11 , C:12 ,D:13 , E:14 , F:15)

ASCII表:

3.注释

        写代码的过程中有的代码不需要或者比较难懂的时候可以加一些注释。

注释有两种形式:a.  /* ........  */  ;  b.  //........(只能注释一行代码)

六 .选择语句。

选择语句有两种:if 语句 和 switch 语句

例如:如果你好好学习,就能找到好工作;如果不好好学习,就找不到好工作。

用 if else 选择语句实现:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int n = 0;
	printf("若好好学习:1\n");
	printf("若不好好学习:0\n");
	scanf("%d", &n);
	if (n == 1)
	{
		printf("有好工作\n");
	}
	else
	{
		printf("没有好工作\n");
	}
	return 0;
}

七 .循环语句。 

循环语句有三种:while 语句 , for 语句 和 do...while 语句

实现打印1~100的数字,用while语句实现:

#include<stdio.h>
int main()
{
	int n = 1;
	while (n <= 100)    //进入while循环
	{
		printf("%d ", n);
		n = n + 1;       
	}
	return 0;
}

运行结果:

八 .函数。

C语言函数是为了能够在编程语言是不频繁的打印相同的内容,为了更好的简化代码,是一段代码能够重复的使用,即给C语言引用了函数的概念,函数分为标准库函数和自定义函数。

标准库函数:C语言中本身存在的,例如printf函数,scanf函数等,但必须要引用相应的头文件,例如<stdio.h>,<string.h>,<math.h>等。

自定义函数:C语言为了使程序员能更好的发挥想象创造力,用于我们自己设计函数,即我们自己设计创造的函数就是自定义函数。

计算两个数的相加:

//不使用函数
#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int c = 0;
	c = a + b;
	printf("%d\n", c);
	return 0;
}

//使用函数
#include<stdio.h>

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

直接调用add函数,即不需要重复的敲写代码了,目前看着虽然使用函数写的代码多一些,但若是需要多组加法运算,写函数就比不写函数的代码更简洁多了。

九 .数组

1.数组定义

定义:一组相同类型元素的集合。

eg:int arr1[5]={1,2,3,4,5};        char arr[5]={'a','b','c','d','e'};

        {1,2,3,4,5}  ->代表数组arr1 的初始化。若一个数组无初始化,则[] 内必须写上一个数值,若一个数组被初始化,则[] 内可以不写数值。

2.数组下标

        为了更好的访问数组内的每一个值,计算机给数组内每个数值都编写了下标位置,且数组下标总是从0 开始的。

eg: int arr[10]={1,2,3,4,5,6,7,8,9,10};

int arr12345678910
下标0123456789

3.打印数组

        访问数组的每一个元素。

十 .操作符。

1.算数操作符

        算数操作符包括 +(加);-(减);*(乘);/(取模);%(取余)        

        除法:包含取余和取模。eg:a除以b -> 10除以3 等于3.....1

        3:即为模 -> a/b

        1:即为余 ->a%b

2.移位操作符

        移位操作符包括 >> (右移位)和<<(左移位)

注:此处移动的是二进制位,移动前需要把10进制数字转换成2进制数字

#include<stdio.h>
int main()
{
	int a = 5;    //int型-4个字节-32个bit为-二进制数为 00000000000000000000000000000101
	int b = a << 2;    //a向左移动2位-后面补0--  (00) 00000000000000000000000000010100--十进制是20
	int c = a >> 2;    //a向右移动2位-前面补0         00000000000000000000000000000001--十进制是1
	printf("b=%d\n", b);
	printf("c=%d\n", c);
	return 0;
}

3.位操作符

        位操作符包括&(按位与)     |(按位或)    ^(按位异或)

        操作的是二进制位:

#include<stdio.h>
int main()
{
	int a = 5;	//a的二进制位101
	int b = 3;	//b的二进制位010
	printf("a & b=%d\n",a & b);		//异为0,同为1		(每列相比)
	printf("a | b=%d\n", a | b);	//有一个1就为1
	printf("a ^ b =%d\n", a ^ b);	//异为1,同为0
	return 0;
}

运行结果:

4.赋值操作符

        赋值操作符包含有:+    +=    -=    *=    /=    &=    %=     ^=    |=    <<=    >>=

a+=3;    a=a+3;
b-=3;    b=b-3;
.....

5.单目操作符

单目操作符指操作数只有一个的操作符

操作符功能
!逻辑反操作
-负值
+正值
&取地址符
sizeof求操作数的类型长度(以字节为单位)
~对一个数的二进制按位取反
--前置/后置--
++前置/后置++
*解引用操作(指针)
(类型)强制类型转换

前置/后置++

int b=a++;    // 后置++:第一步.b=a;第二步.a=a+1    (先赋后加)
int d=++c;    // 前置++:第一步.c=c+1;第二步.d=c    (先加后赋值)

同理前置/后置-- 也一样

(类型):强制类型转换。将某一数据类型转换为另一数据类型

变量 a 原本是一个浮点型的数字,(int)a:强制将浮点型转换为int 型,用%d 打印出来

6.关系操作符

        关系操作符包含有 >    >=    <    <=    !=    ==

        关系操作符用来描述两个数之间的关系,常用于 if else语句中的条件限制。

7.逻辑操作符

        逻辑操作符包含 &&(逻辑与)    ||(逻辑或)

        &&:逻辑与,全部条件都满足才能成功,相当于物理学科中的串联电路。

         ||:逻辑或,只要有一个条件满足就能成功,相当于物理学科中的并联电路。

8.条件操作符

        exp1 ? exp2 : exp3

意指:若exp1为真,则输出 exp2;若exp1为假,则输出 exp3.

9.其他操作符

逗号表达式:exp1,exp2,exp3,...(从左往右依次计算,整个表达式的结果是最后一个表达式的结果)

下标引用,函数调用和结构成员:[]    ()    .    ->

十一 .常见关键字。

C语言中包含有很多关键词,这些关键词C语言本身设定好的,不能被修改。

char    double    float    int    long    short    signed    unsigned    void

if    else    switch    case    default

for    while    break    continue    do     goto

auto    const    enum    struct    union    extern    sizeof    static    register    return    volatile    typedef

十二 .define定义常量和宏。

1. #define 定义常量

#include<stdio.h>
#define max 100    //#定义的(标识符:max)常量
int main()
{
	int a[max] = { 0 };
	int b = max;
	printf("%d\n", max);
	printf("%d\n", b);
	return 0;
}

        标识符常量:如例,就是将100用max这一形式表示出来。

2. #define 定义宏

        有宏就有参数,即x和y。(与函数类似)

        add:宏的名字    (x,y):参数                ((x)+(y)):宏的实现体

#include<stdio.h>
#define add(x,y) ((x)+(y))
int main()
{
	int a = 10;
	int b = 20;
	int c = add(a, b);     //通过宏的实现体-> int c=((a)+(b))
	printf("%d\n", c);
	return 0;
}

运行结果:

十三 .指针。

学习指针,首先就得了解清楚内存,因为指针就是用来访问内存的。

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的,为了有效地使用内存,把内存划分为一个一个的内存单元,每个内存单元的大小是1个字节,并且为了更加有效的访问到内存的每个单元,于是就给内存单元进行了一系列编号,这些编号就被称为该内存单元的地址,因此可以这样理解:地址叫做指针,指针叫做编号

C语言中为了得到地址,就引出了取地址符号 &

#include<stdio.h>
int main()
{
	int a = 10;
	&a;
	int* pa = &a;          //int* 为地址的类型
	printf("%p\n", &a);
	printf("%p\n", pa);    //%p 为打印地址符号
	return 0;
}

因为每个数都有其各自特定的类型,a的类型为 int;故地址也是有类型的,地址的类型即为原本的类型加上*号  例如:int*    double*    struct stu*    float* 等等

若知道地址,从地址中得到此地址指向的内容,这就需要一个解引用操作符 * :

#include<stdio.h>
int main()
{
	int a = 10;
	int* pa = &a;
	int b = *pa;        //通过地址得到地址指向的内容放入b中
	printf("%d\n", b);
	return 0;
}

对地址pa 进行解引用操作即 *pa,此时*pa表示的就是该地址指向的内容a,

打印结果: 

十四 .结构体。

结构体是C语言中重要的知识点,结构体使得C语言有能力描述复杂类型。

例如一个学生,就包含 姓名+年龄+性别+...  。同样一本书,就包含 作者+书名+定价+...

#include<stdio.h>
struct stu            //struct为结构体类型,类似于int a=10 中的int, stu类似于 a
{
    char name[20];    //结构体成员,汉字等为字符串,要放进数组里面,1个汉字为2个字符
    int age;
    char sex[5];
    char id[15];
};

struct book
{
    char name[30];
    char author[10];
    double price;
};

int main()
{
    struct stu s={"张三",15,"男","123456"};    // s为创建的结构体变量,可便于访问里面的对象
    struct book b={"《唐诗三百首》","李白",10.5};

    //结构体第一种形式 .  即:结构体变量.成员
    printf("%s %d %s %s\n",s.name,s.age,s.sex,s.id);
    printf("%s %s %lf\n",b.name,b.author,b.price);

    //结构体第二种形式 ->  即:结构体指针->成员
    struct stu* ps=&s;        //将s的地址赋给ps
    struct book* pb=&b;
    printf("%s %d %s %s\n",ps->name,ps->age,ps->sex,ps->id);
    printf("%s %s %lf\n",pb->name,pb->author,pb->price);

    return 0;
}

运行结果:

  • 54
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值