目录
8. 函数
#include <stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
int a = 0;
int b = 0;
int c = 0;
//输入
scanf("%d %d", &num1, &num2);
//求和
sum = num1 + num2;
//输出
printf("%d\n", sum);
return 0;
}
上述代码写成函数:
int Add(int x, int y)//第一种
{
int z = 0;
z = x + y;
return z;
}
int Add(int x, int y)//第二种
{
return (x + y);
}
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
//输入
scanf("%d %d", &num1, &num2);
//求和
sum = Add(num1, num2);
//输出
printf("%d\n", sum);
return 0;
}
函数其实就相当于代码的封装工厂,可以简化代码,重复使用(之后使用代码实现相同功能时可直接调用函数)。
9. 数组
9.1 数组定义:一组相同类型的元素的集合
int arr1[10] = {1,2,3,4,5,6,7,8,9,10};
int arr2[10] = { 1,2,3,4,5};//不完全初始化,剩余的默认初始化为0
char ch[5] = { 'a', 'b', 'c' };//不完全初始化,剩余默认初始化为\0
9.3 数组的下标
数组的每个元素都有一个下标,下标是从0开始的。数组可以通过下标来访问。
int arr[10] | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
9.3 数组的使用
#include<stdio.h>
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d\n", arr1[6]);
int i = 0;
while (i<10)
{
printf("%d ", arr1[i]);//通过下标访问数组
i = i + 1;
}
return 0;
}
10. 操作符
算术操作符
+ - *
/ 除号 除号的两端如果都是整数,执行的是整数除法;
除号的两端至少有一个数是浮点数,才能执行浮点数的除法
% 取模(取余),%操作的两个操作数必须都是整数
移位操作符:<< >>
位操作符:& ^ |
赋值操作符:= += -= *= /= &= ^= |= >>= <<=
单目操作符
! | 逻辑操作符 |
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度(单位为字节) |
~ | 对一个数的二进制按位取反 |
-- | 前置、后置 |
++ | 前置、后置(先使用,后++) |
* | 间接访问操作符(解引用) |
(类型) | 强制类型转换 |
int a = 10;
printf("&d\n",sizeof(a)); 4
printf("&d\n",sizeof(int)); 4
printf("&d\n",sizeof a); 4 括号可省略,因为sizeof不是函数
int arr[10] = {0};
printf("&d\n",sizeof(arr)); 40 计算的是整个数组的大小,单位是字节
printf("&d\n",sizeof(arr[0])); 4
printf("&d\n",sizeof(arr)/sizeof(arr[0])); 10-数组的元素个数
stelen是函数,会统计字符串\0前的字符个数(不包括\0)
逻辑操作符
&& 逻辑与,都真才为真
|| 逻辑或,有真即为真
条件操作符
exp1?exp2:exp3
真 √ ×
假 × √
逗号表达式
exp1,exp2,exp3,………expN
从左向右依次计算,整个表达式的结果为最后一个式子的结果
11. 常见关键字
11.1 typedef
类型定义,把复杂的类型简化,可以理解为类型重命名
typedef unsigned int un_i;//typedef把复杂的类型简化
int main()
{
unsigned int num1 = 0;
un_i num2=0;
return 0;
}
11.2 static
11.2.1 修饰局部变量
#include<stdio.h>
void test1()
{
int a = 0;
a++;
printf("%d ",a);
}
int main()
{
int i = 0;
for(i=0;i<10;i++)
{
test();
}
return 0;
}
结果为10个1
#include<stdio.h>//static修饰局部变量使其出了作用域还有效
void test2()
{
static int i = 0;
i++;
printf("%d",i);
}
int main()
{
int i = 0;
for(i=0;i<10;i++)
{
test2();
}
return 0;
}
结果为1 2 3 4 5 6 7 8 9 10
static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。本质上改变了变量的储存位置。
11.2.2 修饰全局变量
代码1:
//add.c
int global_v = 2024;
//test.c
int main()
{
printf("%d\n",global_v);
return 0;
}
代码2:
//add.c
static int global_v = 2023;
//test.c
int main()
{
printf("%d",global_v);
return 0;
}
代码1正常,代码2会出现错误:一个全局变量被static修饰,使得这个全局变量只在本源文件内使用,不能在其他源文件中使用。感觉作用域变小了,实际外部链接变内部链接。
11.2.3 修饰函数
//声明外部函数
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;
}
与修饰全局变量类似,一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件(不同的.c文件)内使用。
12. #define定义常量和宏
#define MAX 100//定义常量
#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;
}
13. 指针
13.1 内存
每个内存单元大小为1个字节。
给内存单元分配的编号被称为该内存单元的地址。
变量是创建在内存中的,所以变量也是有地址的。
#include<stdio.h>
int main()
{
int num = 10;
int *p=#
*p=20;
printf("%p\n",&num);
}
p是一个变量,这个变量是用来存放地址的
而地址又叫指针
所以在C语言中把p叫指针变量(指针变量是存放指针的变量)
&a; & 取地址操作符
printf("%p\n", &a);
&a 取出的是a所占内存的4个字节中第一个字节的地址
#include<stdio.h>
int main()
{
char ch = 'w';
char* pc = &ch;
//通过pc把ch的值改'b'
*pc = 'b';
printf("%c\n", *pc);//b
ch = 'q';
printf("%c\n", *pc);//q
return 0;
}
1. 指针就是地址
2. 口头语中指针一般指的是指针变量
13.2 指针变量大小
#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位平台下的地址是4个字节;64位平台下的地址是8个字节
不论什么类型的指针,都是在创建指针变量。
14. 结构体
结构体可以使C语言有能力描述复杂类型。
比如描述一个包含众多特征的一类群体。
//学生:名字+性别+年龄
//定义一个学生类型
struct Stu
{
char name[20];
char sex[5];
int age;
};
void Print(struct Stu* ps)
{
printf("%s %s %d\n", (*ps).name, (*ps).sex, (*ps).age);
//结构体的指针->成员名
printf("%s %s %d\n", ps->name, ps->sex, ps->age);
}
int main()
{
int num = 0;
struct Stu s = {"lisi", "男", 22};
struct Stu s2 = { "zhangsan", "女", 18 };
Print(&s);
//结构体变量.成员名
printf("%s\n", s2.name);
printf("%s\n", s2.sex);
printf("%d\n", s2.age);
return 0;
}
本章完。