初识C语言

该博客全面介绍C语言知识,涵盖基本数据类型(如变量、常量、整形等)、操作符(算术、移位等)、选择与循环语句、函数、数组、常见关键字、指针和结构体等内容,详细讲解各部分概念、规则及使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.什么是C语言

2.C语言的基本数据类型

2.1 变量和常量

2.1.1 常量

2.1.2 变量

2.2 整形

2.3 实型(又称浮点型)

2.4 字符型

2.5 字符串

2.6 转义字符

3. 操作符

3.1 算术操作符

3.2 移位操作符

3.2.1 左移位

3.2.2 右移位

3.3 位操作符

3.4 赋值操作符

3.5 单目操作符

3.6 关系操作符

3.7 逻辑操作符

3.8 条件操作符(三目操作符)

3.9 逗号表达式

3.10 下标引用、函数调用和成员结构

4. 选择语句

4.1 if语句

4.1.1 if语句

 4.1.2 if...else语句

 4.1.3 if…else if…else 语句

4.2 switch语句

5.循环语句

5.1 for循环

5.2 while循环

5.3 do...while循环

6.函数

7.数组 

7.1 数组的定义

7.2 数组的下标

7.3 数组的使用

 8.常见的关键字

8.1 typedef

8.2 关键字static

 8.2.1 修饰局部变量

 8.2.2 修饰全局变量

8.2.3 修饰函数

 8.3 关键字register-寄存器

9.#define定义常量和宏

10.指针

10.1内存

10.2指针和指针变量

11.结构体


1.什么是C语言

C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易
的方式编译、处理低级存储器、产 生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。 尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的 C语言程序可在许多电脑平台上进 行编译,甚至包含一些嵌入式处理器(单片机或MCU)以及超级电脑等作业平台。 二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,美国国家标准局为C语言制 定了一套完整的美国国家标准语 法,称为ANSI C,作为C语言最初的标准。 [1] 目前2011年12月8日,国际标准化组织(ISO)和 国际电工委员会(IEC)发布的C11
标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字
标识符,一定程度上实现了汉 字编程。 C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。 

2.C语言的基本数据类型

2.1 变量和常量

2.1.1 常量

在程序运行过程中,其值不能改变的量称为常量。如:圆周率,身份证,性别等

分类:整型常量、浮点型常量、字符常量、符号常量、字符串常量。

C语言中的常量可以分为以下几种

* 字面常量

* const 修饰的常变量

* #define 定义的标识符常量(#define max 100

* 枚举类型( enum color{ red,green,blue};

#include <stdio.h>
//举例
enum Sex
{
 MALE,
 FEMALE,
 SECRET
};
//括号中的MALE,FEMALE,SECRET是枚举常量
int main()
{
    //字面常量演示
    3.14;//字面常量
    1000;//字面常量
    
    //const 修饰的常变量
    const float pai = 3.14f;   //这里的pai是const修饰的常变量
    pai = 5.14;//是不能直接修改的!
    
    //#define的标识符常量 演示
 #define MAX 100
    printf("max = %d\n", MAX);
    
    //枚举常量演示
    printf("%d\n", MALE);
    printf("%d\n", FEMALE);
    printf("%d\n", SECRET);
    //注:枚举常量的默认是从0开始,依次向下递增1的

    return 0;
}

2.1.2 变量

在程序运行过程中,其值可以改变的量为变量。

变量声明和使用:

#include <stdio.h>
int main()
{
    int num1 = 0;
   int num2 = 0;
    int sum = 0;
    printf("输入两个操作数:>");
    scanf("%d %d", &num1, &num2);
    sum = num1 + num2;
    printf("sum = %d\n", sum);
    return 0;
}

分类:局部变量:、全局变量

*当局部变量和全局变量同名的时候,局部变量优先使用

#include <stdio.h>
int global = 2019;//全局变量
int main()
{
    int local = 2018;//局部变量

    return 0;
}

变量的作用域

局部变量的作用域是变量所在的局部范围

全局变量的作用域是整个程序

变量的生命周期

局部变量的生命周期从进入作用于开始,出作用域结束。

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

2.2 整形

整型分为整形常量和整形变量。

1.短整型(short):内存中占2个字节,取值范围:-32768 ~ + 32767 (2 Bytes)。

2.基本整形(int):4字节,-2147483648 ~ +2147483647。

3.长整型(long):同 int

4.长长整形(long long):8字节。

2.3 实型(又称浮点型)

1.单精度(float):4字节,至少能精确表示小数点后6位有效数字。格式说明符:%f

2.双精度(double):8字节,至少能精确表示小数点后12位有效数字。格式说明符:%lf

3.长双精度(long double):12字节

2.4 字符型

1.字符常量:用一对单引号括起来的单个字符称为字符常量。如‘A’,‘6’等

2.字符变量:字符变量用来存储字符常量。将一个字符常量存储到一个字符变量中,实际上是将该字符的ASCII码值存储到内存单元中。

2.5 字符串

C语言没有字符串类型,“ajsjas”双引号引起来的是字符串字面值。

C语言规定:在存储字符串常量时,系统会在字符串末尾会加一个 \0 作为结束标志。

2.6 转义字符

转义字符功能
\n换行
\t横向跳格
\v竖向跳格
\b退格
\r回车
\f走纸换页
\a响铃
\\反斜杠\
\0字符串结束标志,0,表示空
\'单引号 ' 字符
\"双引号 " 字符
\dddddd表示1~3个八进制数字。如:\130表示八进制130的数88代表的ASCII码值: x
\xdddd表示2个十六进制。如:\x30 0
打印格式功能
%d打印整形
%c打印字符
%s打印字符串
%f打印 float类型的数据
%lf打印double类型的数据
%zu打印sizeof的返回值

3. 操作符

3.1 算术操作符

+、- 、*、/ 、%    加减乘除和取余

注意:

1.加减乘除用于整数和浮点数的运算

2.%运算符只能用于两个整数相除,返回余数。

3.当使用/运算符时,如果两个操作数均为整型,那么执行整数除法,运算结果也为整型;如果两个操作数至少一个为浮点数,那么执行浮点数运算,运算结果为浮点型。

3.2 移位操作符

<<、>> 左移位和右移位

移动的是补码的二进制序列。

3.2.1 左移位

移位规则:左边抛弃,右边补0。

将要移位的数字的二进制形式的补码(整数在内存中存储的是补码)向左移位,左边的抛弃,右边补0.

3.2.2 右移位

右移位分两种:算术移位和逻辑移位

1.算数移位规则:左边用该值的符号位填充,右边丢弃。

2.逻辑移位规则:左边用0补充,右边丢弃。

3.3 位操作符

&、 | 、^

符号说明:

&    --->  按位与(两个二进制操作数对应位同为 1 ,结果位才为 1 ,其余情况为 0 。“有0出0”)

 |     --->  按位或(两个二进制操作数对应位只要有一个为 1 ,结果 位 就为 1 ,其余情况为 0 “有1出1”)    

 ^     --->  按位异或(相同为0,相异为1) 

3.4 赋值操作符

=、+=、-=、*=、/=、^=、&=、|=、>>=、<<=

3.5 单目操作符

! 、- 、+ 、&、sizeof、~(对一个数的二进制按位取反) 、--(前置、后置--)、++(前置、后置++)、*、(类型)强制类型转换、

3.6 关系操作符

<、<=、>、>=、!=、==、

3.7 逻辑操作符

&&逻辑与-并且

|| 逻辑或-或者

3.8 条件操作符(三目操作符)

exp1 ?exp2 :exp3

  真   ?  对   :  错

  假   ?  错   :  对

如果满足exp1的条件就返回exp2,否则exp3

3.9 逗号表达式

(exp1, exp2,exp3,exp4 );

用逗号隔开的一串表达式,从左向右依次计算,整个表达式的结果是最后一个表达式的结果。

3.10 下标引用、函数调用和成员结构

[] 、()、. 、->

4. 选择语句

选择结构指的是进行逻辑判断,当满足与某些条件的时候才会执行某些语句。

4.1 if语句

if语句通过判断表达式的值从两种选项中选择一种。if语句有三种情况:

4.1.1 if语句

if (表达式)
{
    语句块1;
}

当只有 if 的时候,表达式为真就执行语句块1,否则就跳过语句块的内容。 

 4.1.2 if...else语句

if (表达式)
{
    语句块1;
}
else
{
    语句块2;
}

 当 if…else 的时候,表达式为真就执行语句块1,表达式为假就执行语句块2。

 4.1.3 if…else if…else 语句

if (表达式1)
{
    语句块1;
}
else if(表达式2)
{
    语句块2;
}
else
{
	语句块3;
}

其执行过程如下:

4.2 switch语句

if语句处理两个分支,当处理多个分支时需使用多个if-else语句,而switch语句可以直接处理多个分支(当然包括两个分支)。

switch(表达式1)
{
	case 表达式2:
		语句块2;
		break;
	case 表达式3:
		语句块3;
		break;
	case 表达式4:
		语句块4;
		break;
	……
	default:
		语句块n;
		break;
}

注意:

1.当语句块后面没有 break时,程序就会继续执行下面的内容,直到遇到break才会跳出switch结构。

2.当语句块后面都有break时,case出现的次序不影响执行结果。

3.case后面包含多个语句时,不需要加大括号(从 :开始执行)。

4.多个case可以共用一组执行语句。例如:

case '表达式1':
case '表达式2':
case '表达式3': 语句块; break;

5.循环语句

循环语句是用于重复执行某条语句(循环体)的语句,它包含三个部分,分别是初始化部分、判断部分和调整循环部分。C语言提供了3中循环语句,分别为while语句,do while语句和for语句。

5.1 for循环

for( 循环变量初始化 ; 循环判断 ; 循环变量自增 )
{
    循环体;
}

for循环流程图:

 

5.2 while循环

//while循环的语法
while(表达式)
{
    循环语句;
    循环变量自增;
}    

while循环流程图: 

 

5.3 do...while循环

//do...while循环语法
do
{
    循环体语句;
    循环变量自增;
 
}while( 循环判断 );

 do...while循环结构图:

注意:

1.while循环是“先判断,后执行”,而do...while是“先执行后判断”。

2.循环体语句组可以是单个语句、空语句,也可以是复合句,当循环体是单个语句时,可以省略花括号。如:while (i<=100)sum+=i++;

3.为了使循环结束,不出现“无限循环”“死循环”,要使循环语句中有使表达式趋于“逻辑假”的语句,如:“i++;”语句

4.变量的初始值要在while语句之前赋给。

6.函数

函数的定义是子程序。子程序是一个大型程序中的某部分代码,由一个或多个语句块组成,他负责完成某项特定的任务,而且相较于其他的代码,具备相对的独立性。

一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软
件库。

#include <stdio.h>
//定义Add函数
int Add(int x, int y)
{
   int z = x+y;
   return z;
}
int main()
{
    int num1 = 0;
   int num2 = 0;
    int sum = 0;
    printf("输入两个操作数:>");
    scanf("%d %d", &num1, &num2);
   //使用Add函数
    sum = Add(num1, num2);
    printf("sum = %d\n", sum);
    return 0;
}

7.数组 

7.1 数组的定义

//定义一个整形数组,最多放是个元素
int arr[10] = {0,1,2,3,4,5,6,7,8,9};

7.2 数组的下标

C 语言规定:数组的每个元素都有一个下标,下标是从 0 开始的。
数组可以通过下标来访问的。
比如:
int arr[10] = {0};
//如果数组10个元素,下标的范围是0-9
int arr[ 10 ]12345678910
下标0123456789

7.3 数组的使用

#include <stdio.h>
int main()
{
 int i = 0;
 int arr[10] = {1,2,3,4,5,6,7,8,9,10};
 for(i=0; i<10; i++)
 {
       printf("%d ", arr[i]);
 }
 printf("\n");
    return 0;
}

 8.常见的关键字

auto 、break、case、char、const、continue、default、do、double、else、enum、extern、
float、for、goto、if、int、long、register、return、short、signed、sizeof、static、
struct、switch、typedef、union、unsigned、void、volatile、while

8.1 typedef

typedef:类型定义,类型重命名,数据类型取别名。

//将unsigned int重命名为uint
//将struct Node重命名为Node
typedef unsigned int uint;
typedef struct Node
{
    int data;
    struct Node*next;
}Node;
int main()
{
    //unsigned int num = 0;等价于
    uint num2 = 1; 
    // struct Node n; 等于
    Node n2;
    
    return 0;
}   

8.2 关键字static

在c中static是用来修饰变量和函数的

1.修饰局部变量-称为静态局部变量

2.修饰全局变量-称为静态全局变量

3.修饰函数-称为静态函数

 8.2.1 修饰局部变量

#include <stdio.h>
void test()
{
    //int a = 1;
    static int a =1;
    //用static修饰局部变量时候局部变量出了作用域是不销毁的,
    //本质上static修饰局部变量,改变了变量的存储位置,存在了静态区。
    a++;
    printf("%d",a);
}
int main()
{
    int i = 0;
    while (i < 10)
    {
        test();
        i++;
    }
    return 0;
}

 8.2.2 修饰全局变量

//全局变量,是具有外部链接属性的
int g_val = 2022;
//static修饰全局变量的时候,
//全局变量的外部链接属性变成了内部链接属性,其他源文件就不能再使用这个全局变量了。
//static int g_val = 2022;
//声明外部符号
extern int g_val;
int main()
{
    //没有static修饰,这里就可以使用g_val,有static修饰就不能使用。
    printf("%d\n",g_val);
    return 0;
}

8.2.3 修饰函数

//函数也是具有外部链接属性
int Add(int x,int y)
{
    return x + y;
}
//用static修饰函数,函数就不再具有外部链接属性,
// static int Add(int x,int y)
// {
//    return x = y;
// }
extern int Add(int x,int y);
int main()
{
    int a =10;
    int b = 20;
    int c = Add(a,b);
    printf("%d\n",c);
    return 0;
}

 8.3 关键字register-寄存器

电脑的存储设备:(读写速度由快到慢,空间由小到大,造价由高到低)

1.寄存器(集成到CPU上)

2.高速缓存

3.内存 8/16G

4.硬盘

int main()
{
    //建议:3存放在寄存器中
    register int num = 3;
    return 0;
}

9.#define定义常量和宏

//#define定义标识符常量
#define NUM 100

int main()
{
    printf("%d\n",NUM);
    int n = NUM;
    printf("%d\n",n);
    int arr[NUM] = {0};
    
    return 0;
}
//#define 定义宏
//宏有参数
//函数是传参,宏是直接替换
//宏的参数是无类型
#define ADD(x,y) ( (x)+(y) )

int main(){
    int a = 10;
    int b = 20;

    int c = ADD(a,b);
    pruntf("%d\n",c);
    
    return 0;
}

10.指针

10.1内存

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。

为了有效的使用内存,把内存划分成一个个小的内存单元,每个内存单元的大小是一个字节。为了能够有效的访问到内存的某个单元,给内存的每个单元进行编号,这些编号被称为该内存单元的地址。

10.2指针和指针变量

1.指针:指针其实就是地址,

通常的,我们在程序中定义了一个变量a,在编译时这个变量a会向内存中申请一定的内存来存储变量a的值,系统则根据变量的类型给变量分配一定长度的字节数.

通过地址可以找到所需的变量单元,因此可以说地址“指向”该变量单元,在c语言中,将地址形象化地称为“指针”。

2.指针变量:用一个变量专门存放指针(地址),称为指针变量。

int main()
{
    int a = 10;//int 类型4个字节
    // &a,取地址操作符
    printf("%p\n",&a);//0x0012ff40(地址)
    //指针变量的定义
    // 类型名 *指针变量名;
    int* p = &a;//p就是指针变量
    *p = 20;//解引用操作符,意思是通过p中存放的地址,找到p所指向的对象,*p就是p指向的对象
    printf("%d\n",a); //a=20
    
    return 0;
}

11.结构体

结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。

定义结构体:先定义结构,再声明结构变量。

struct Stu
{
    char name[20];
    int age;
    char sex[10];
    char tele[12];
};

void print(struct Stu * ps)
{
    printf("%s %d %s %s\n",(*ps).name,(*ps).age,(*ps).sex,(*ps).tele);
    //结构体指针变量->成员名
    printf("%s %d %s %s\n", ps -> name, ps -> age, ps -> sex, ps -> tele );
}
    
int main()
{
    struct Stu s = {"张三",20,"男","123456789123"};
    //结构体对象.成员名
    printf("%s %d %s %s\n",s.name,s.age,s.sex,s.tele);
    print(&s);
    return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值