目录
一、数据类型、常量、变量及运算符
(1)数据类型
-
基本数据类型:
- int:用于声明整数类型的变量,通常占据4个字节(32位系统)或8个字节(64位系统)的内存空间。
- char:用于声明字符类型的变量,通常占据1个字节的内存空间,表示ASCII字符集中的一个字符。
- float:用于声明单精度浮点数类型的变量,通常占据4个字节的内存空间。
- double:用于声明双精度浮点数类型的变量,通常占据8个字节的内存空间。
-
派生数据类型:
- 数组(Array):用于声明相同类型的连续内存空间组成的集合。
- 指针(Pointer):用于存储变量的地址,可以指向其他变量或函数。
- 结构体(Struct):用于将多个不同类型的变量组合在一起形成一个新的数据类型。
- 联合体(Union):类似于结构体,但所有成员共享同一块内存空间,用于节省内存。
-
枚举类型(Enum):用于声明一组具有名称的常量,这些常量的值可以自动递增或手动指定。
-
void类型:表示空类型,通常用于函数返回类型,表示函数不返回任何值。
(2)常量与变量
-
常量(Constants):
- 常量是程序中固定不变的值,不能被修改。
- 常量可以是文字常量(例如,整数常量、浮点数常量、字符常量等)或符号常量(使用
#define
或const
关键字定义的常量)。
-
变量(Variables):
- 变量是用来存储可变数据的标识符。
- 变量在程序运行时可以被赋予不同的值。
- 变量需要在使用前声明,并且需要指定其数据类型。
(3)运算符
-
算术运算符:
+
:加法-
:减法*
:乘法/
:除法%
:取模(求余)
-
关系运算符:
==
:等于!=
:不等于<
:小于>
:大于<=
:小于等于>=
:大于等于
-
逻辑运算符:
&&
:逻辑与(AND)||
:逻辑或(OR)!
:逻辑非(NOT)
-
位运算符:
&
:按位与|
:按位或^
:按位异或~
:按位取反<<
:左移>>
:右移
-
赋值运算符:
=
:简单赋值+=
:加法赋值-=
:减法赋值*=
:乘法赋值/=
:除法赋值%=
:取模赋值&=
:按位与赋值|=
:按位或赋值^=
:按位异或赋值<<=
:左移赋值>>=
:右移赋值
二、输入输出
-
输入函数:
scanf()
:用于从标准输入(通常是键盘)读取输入数据,并根据指定的格式化字符串将输入数据存储到相应的变量中。 -
输出函数:
printf()
:用于向标准输出(通常是显示屏)打印输出数据,并根据指定的格式化字符串格式化输出内容。 -
文件输入输出:
fscanf()
:用于从文件中读取数据。fprintf()
:用于向文件中写入数据。
-
字符输入输出:
getchar()
:从标准输入中读取一个字符。putchar()
:向标准输出打印一个字符。
-
字符串输入输出:
gets()
:从标准输入中读取字符串(不推荐使用,存在安全风险)。fgets()
:从文件中读取一行字符串。puts()
:向标准输出打印字符串。
三、控制语句
(1)分支语句
1.if-else
基本语法为:
if (condition)
{ // 当条件为真时执行的代码块 }
else
{ // 当条件为假时执行的代码块 }
其中,condition
是一个表达式,可以是任何返回值为真(非零)或假(零)的表达式。如果condition
为真,则执行if
后面的代码块;如果condition
为假,则执行else
后面的代码块。
例如:判断一个数是否为正数:
#include <stdio.h>
int main() {
int num;
printf("请输入一个整数:");
scanf("%d", &num);
if (num > 0) {
printf("输入的数是正数\n");
} else {
printf("输入的数不是正数\n");
}
return 0;
}
2.Switch-case
基本语法为:
switch (expression)
{
case constant1:
// 当表达式等于 constant1 时执行的代码块
break;
case constant2:
// 当表达式等于 constant2 时执行的代码块
break;
// 可以有更多的 case 分支
default:
// 当表达式不匹配任何 case 时执行的代码块(可选)
}
expression
是一个表达式,通常是一个整型或字符型的值。- 每个
case
后面跟着一个常量表达式,当expression
的值等于某个case
后面的常量表达式时,就会执行该case
后面的代码块。 break
语句用于跳出switch
语句块,防止继续执行下一个case
中的代码。如果没有break
,程序会继续执行下一个case
中的代码,直到遇到break
或者switch
语句结束。default
是可选的,用于处理expression
不匹配任何case
的情况,类似于if-else
语句中的else
。
例如:根据用户输入的数字输出相应的星期几:
#include <stdio.h>
int main() {
int day;
printf("请输入一个数字(1-7):");
scanf("%d", &day);
switch (day) {
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期日\n");
break;
default:
printf("输入无效\n");
break;
}
return 0;
}
(2)循环语句
1.do-while
基本语法为:
do
{
// 循环体
} while (condition);
do
后面跟着花括号包裹的循环体,包含需要重复执行的语句。while
后面跟着条件表达式,用于判断是否继续循环。如果条件为真,则继续执行循环体;如果条件为假,则退出循环。
例如:计算1到10的整数之和:
#include <stdio.h>
int main() {
int sum = 0;
int i = 1;
do {
sum += i;
i++;
} while (i <= 10);
printf("1到10的整数之和为:%d\n", sum);
return 0;
}
2.for
基本语法为:
for (initialization; condition; increment/decrement)
{
// 循环体
}
initialization
表达式用于初始化循环控制变量,通常是一个计数器。condition
表达式在每次循环迭代开始时进行检查,如果条件为真,则执行循环体;如果条件为假,则退出循环。increment/decrement
表达式用于每次循环迭代后更新循环控制变量的值。
例如:计算1到10的整数之和:
#include <stdio.h>
int main() {
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += i;
}
printf("1到10的整数之和为:%d\n", sum);
return 0;
}
四、数组
(1)一维数组
1.初始化
// 声明一个整型数组
int numbers[5];
// 声明并初始化一个整型数组
int numbers[5] = {1, 2, 3, 4, 5};
// 可以只初始化部分元素,其他元素将被自动初始化为0
int numbers[5] = {1, 2}; // numbers数组为 {1, 2, 0, 0, 0}
2.排序法
①冒泡排序法
#include<stdio.h>
void sort(int arr[],int n)
{
int i,j,temp;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(arr[j]>arr[j+1])
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
int main()
{
int arr[10];
int n=10;
printf("请输入数组:\n");
for(int k=0;k<n;k++)
{
scanf("%d",&arr[k]);
}
printf("初始数组:\n");
for(int i=0;i<n;i++)
{
printf("%d\t",arr[i]);
}
printf("\n");
sort(arr,n);
printf("排序后:\n");
for(int j=0;j<n;j++)
{
printf("%d\t",arr[j]);
}
printf("\n");
return 0;
}
②插入排序法
#include<stdio.h>
void insert(int arr[],int n)
{
int i,j,k;
for(i=0;i<n;i++)
{
k=arr[i];
j=i-1;
while(j>=0&&arr[j]>k)
{
arr[j+1]=arr[j];
j=j-1;
}
arr[j+1]=k;
}
}
int main()
{
int arr[10]={1,23,45,12,23,42,25,17,26,98};
int n=10;
printf("排序前的数组为:\n");
for(int i=0;i<n;i++)
{
printf("%d\t",arr[i]);
}
printf("\n");
insert(arr,10);
printf("排序后的数组为:\n");
for(int i=0;i<n;i++)
{
printf("%d\t",arr[i]);
}
printf("\n");
return 0;
}
(2)二维数组
维数组是指数组中的元素也是数组的数组,形成了类似表格或矩阵的结构。在 C 语言中,二维数组可以看作是一个数组的数组,每个元素都是一个一维数组。下面是一个简单的二维数组的声明和初始化示例:
#include <stdio.h>
int main() {
// 声明一个 3x3 的二维数组
int matrix[3][3];
// 初始化二维数组
int rows = 3;
int cols = 3;
int count = 1;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matrix[i][j] = count;
count++;
}
}
// 访问和输出二维数组中的元素
printf("二维数组中的元素:\n");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
return 0;
}
五、指针
指针实际上是一个变量,它存储的是一个内存地址,而不是一个常规的值。通过指针,我们可以直接访问内存中的数据,这使得在编程中能够更加灵活地操作数据和内存。
在 C 语言中,你可以使用指针来执行以下操作:
-
声明指针变量: 你可以通过在变量名前面加上星号 (*) 来声明一个指针变量。例如:
int *ptr;
声明了一个指向整数的指针变量。 -
获取变量地址: 通过在变量名前面加上取地址符号 (&),你可以获取该变量的内存地址。例如:
int num = 10; int *ptr = #
这里&num
就是获取num
变量的地址,并将该地址赋值给指针变量ptr
。 -
间接访问(解引用): 通过在指针变量前面加上星号 (*),你可以访问指针所指向的变量的值。例如:
int num = 10; int *ptr = # printf("%d", *ptr);
这里*ptr
就是获取指针ptr
所指向的变量的值,即num
的值。 -
指针算术运算: 在指针上进行算术运算,例如加法和减法,可以让指针指向内存中的其他位置。这在数组和动态内存分配中特别有用。