函数
在c语言中,程序员可以把一些独立的功能,封装成一个函数
拿一个简单的加法程序做例子
代码1:
#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; }
如果将加法运算的过程封装成函数,就写成以下代码
代码2:
#include <stdio.h>
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);
sum = Add(num1, num2);
printf("sum = %d\n", sum);
return 0; }
好处就在需要的时候可以随时调用这个函数,不用重新再写一遍运算过程
数组
数组就是一组相同类型元素的集合
数组定义
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
//定义一个整形数组,最多放10个元素
数组的下标
C
语言规定:数组的每个元素都有一个下标,下标是从
0
开始的。
数组可以通过下标来访问的。
比如上面提到的数组:
arr[10] | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
数组的使用
如果我们想要把一个一维数组的内容打印出来,可以使用for循环语句
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
for(i=0; i<10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
操作符
C语言中有丰富的操作符,给我们提供了以下类型的操作符
算术操作符
预算符 | 描述 |
+ | 把两个操作数相加 |
- | 从第一个操作数中减去第二个操作数 |
* | 把两个操作数相乘 |
/ | 分子除以分母 |
% | 取模运算符,整除后的余数 |
++ | 自增运算符,整数值增加 1 |
-- | 自减运算符,整数值减少 1 |
关系运算符
运算符 | 描述 |
== | 判断两个操作数的值是否相等,如果相等则条件为真。 |
!= | 判断两个操作数的值是否相等,如果不相等则条件为真。 |
> | 判断左操作数的值是否大于右操作数的值,如果是则条件为真。 |
< | 判断左操作数的值是否小于右操作数的值,如果是则条件为真。 |
>= | 判断左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 |
<= | 判断左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 |
逻辑运算符
运算符 | 描述 |
&& | 逻辑与运算符。如果两个操作数都非零,则条件为真。 |
|| | 逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 |
! | 逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 |
位运算符
运算符 | 描述 |
& | 按位与操作,按二进制位进行"与"运算。 |
| | 按位或运算符,按二进制位进行"或"运算。 |
^ | 异或运算符,按二进制位进行"异或"运算。 |
~ | 取反运算符,按二进制位进行"取反"运算。 |
<< | 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。 |
>> | 二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。 |
赋值运算符
运算符 | 描述 |
= | 简单的赋值运算符,把右边操作数的值赋给左边操作数 |
+= | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 |
-= | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 |
*= | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 |
/= | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 |
%= | 求模且赋值运算符,求两个操作数的模赋值给左边操作数 |
<<= | 左移且赋值运算符 |
>>= | 右移且赋值运算符 |
&= | 按位与且赋值运算符 |
^= | 按位异或且赋值运算符 |
|= | 按位或且赋值运算符 |
其他运算符
运算符 | 描述 |
sizeof() | 返回变量的大小。 |
& | 返回变量的地址。 |
* | 指向一个变量。 |
? : | 条件表达式,如果条件为真 ? 则值为 X : 否则值为 Y |
关键字 typedef
可以使用typedef 关键字,用它来为类型取一个新的名字。
//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名
typedef unsigned int uint_32;
int main()
{
//观察num1和num2,这两个变量的类型是一样的
unsigned int num1 = 0;
uint_32 num2 = 0;
return 0; }
关键字static
在
C
语言中:
static
是用来修饰变量和函数的
1.
修饰局部变量
-
称为静态局部变量
2.
修饰全局变量
-
称为静态全局变量
3.
修饰函数
-
称为静态函数
#define 定义常量和宏
//define定义标识符常量
#define MAX 1000
//define定义宏
#define ADD(x, y) ((x)+(y))
#include <stdio.h>
int main()
{
int sum = ADD(2, 3);
printf("sum = %d\n", sum);
sum = 10*ADD(2, 3);
printf("sum = %d\n", sum);
return 0; }
指针
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是
1
个字节
。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该
内存单元的地
址
。
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。
取出变量地址如下:
#include <stdio.h>
int main()
{
int num = 10;
#//取出num的地址
//注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
printf("%p\n", &num);//打印地址,%p是以地址的形式打印
return 0; }
指针的使用例子
#include <stdio.h>
int main()
{
int num = 10;
int *p = #
*p = 20;
return 0; }
指针变量的大小
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(char *));
printf("%d\n", sizeof(short *));
printf("%d\n", sizeof(int *));
printf("%d\n", sizeof(double *));
return 0; }
指针变量的大小取决于地址的大小
32位平台下地址是32个bit位(即4个字节)
64位平台下地址是64个bit位(即8个字节)
结构体
结构体是
C
语言中特别重要的知识点,结构体使得
C
语言有能力描述复杂类型。
比如描述学生,职员包含:
名字
+
年龄
+
性别
+
工号
这几项信息。
这里只能使用结构体来描述了。
struct Stu
{
char name[20];//名字
int age; //年龄
char sex[5]; //性别
char id[15]; //工号
};
struct --- 定义结构体的关键字
结构体初始化
//打印结构体信息
struct Stu s = {"李四", 22, "男", "20220101"};
//.为结构成员访问操作符
printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);
//->操作符
struct Stu *ps = &s;
printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps- >id);
结构体成员访问的操作符
操作符 | 用法 |
. | 结构体变量.结构体成员 |
-> | 结构体指针->结构体成员 |