一、引言
在前面,大家和我一起学习了初识C语言的上篇,https://blog.csdn.net/m0_66032294/article/details/123286975?spm=1001.2014.3001.5501 ,哈哈,其实C语言的重点内容还是很多的呢。相信大家已经对C语言部分已经有了一个初步的了解
8.数组
我们平时要是存储1-10的数字,应该怎么存储呢?
这样我们想到一个很好的方法,用数组来存储呀。
8.1数组定义
数组的定义方法很简单
比如我们要存储1-10的数字,
int arr[10]={1,2,3,4,5,6,7,8,9,10};
这样很容易就能把数组定义成功了
int arr[]={1,2,3,4,5,6,7,8,9,10};//就算我们不在前面的中括号中写出数组的大小,编译器也能够自动识别数组长度
int arr[10]={0};//这种定义方法是默认把数组全部初始化为0
//特别的 如果前面中括号没写出数组大小,后面一定要初始化
//要注意的是不能够用变量来表示数组大小
int i=10;
int arr[i]={0};//这样来初始化数组是错误的,在C99中,基于gcc编译器才能支持这种初始化,在我们日常使用的vs编译器中是不能够支持的
#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++)//利用for循环将数组中的字母全部打印出来
{
printf("%d ", arr[i]);
}
return 0;
}
9.操作符
算术操作符:
+ - * /
移位操作符
把十进制数字转换为2进制表示
>> <<
赋值操作符:
= += -= *= /= ^= |= >>= <<=
位操作符:操作的也是二进制位
& ^ |---------分别是按位与、按位异或、按位或
单目操作符:到底为什么叫单目操作符呢?在后面的博文中我会继续更新的哦
! | 逻辑反操作 |
---|---|
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度 |
~ | 对一个数的二进制进行取反 |
– | 前置后置– |
++ | 前置,后置++ |
* | 解引用操作符 |
(类型) | 强制类型转换 |
关系操作符:
> | |
---|---|
>= | |
< | |
<= | |
!= | 用于测试“不相等” |
== | 用于测试“相等” |
逻辑操作符:
&& | 逻辑与 |
---|---|
|| | 逻辑或 |
条件操作符:
exp1?exp2:exp3
这个条件操作符特别有意思
-
对于条件表达式b ? x : y,先计算条件b,然后进行判断。如果b的值为true,计算x的值,运算结果为x的值;否则,计算y的值,运算结果为y的值。一个条件表达式绝不会既计算x…
-
逗号表达式
-
exp1,exp2,exp3,...expn
下表引用,函数调用和结构成员
[] () . ->
10.常见关键字
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
在这里给大家简单讲解一下关键字static
10.1关键字static
1、修饰局部变量----静态局部变量
修饰局部变量的时候会把局部变量的生命周期提长
正常的局部变量测试,我们用如下代码来测试
#include<stdio.h>
void test()
{
int i = 0;//定义一个局部变量i
i++;
printf("%d ", i);//打印局部变量
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test();//对局部变量进行调用
}
return 0;
}
不难发现,上述代码的结果输出全为1,为什么全是1呢?因为局部变量在函数被调用生命周期就结束了。
如果我们把局部变量定义为静态局部变量呢?
#include<stdio.h>
void test()
{
static int i = 0;//将局部变量定义为静态局部变量
i++;
printf("%d ", i);//打印局部变量
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test();//对局部变量进行调用
}
return 0;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9jONnetd-1646538387372)(C:\Users\97729\Pictures\Saved Pictures\QQ拼音截图20220306072625.png)]
哈哈,我想大家都能猜到了,静态局部变量相比于局部变量,生命周期提长了,现在是程序结束它才结束啦 。
2、修饰全局变量----静态全局变量
修饰全局变量的时候呀,大家还记得extern可以声明外部符号吗?如果全局变量被修饰成静态全局变量了,我们就只能在本源文件使用啦。
3、修饰函数----静态函数
修饰函数的话,使得函数只能在本源文件中使用
下面给大家解释一下是什么意思
//add.c源文件中:
int Add(int x,int y)//在add.c这个源文件中定义函数体
{
return x+y;
}
//在test源文件中:
#include<stdio.h>
int main()
{
printf("%d ",Add(2,3));//在test.c中可以直接调用add.c文件中的函数
return 0;
}
如果我们把add.c文件中的函数变为静态函数呢?
//add.c源文件中:
static int Add(int x,int y)//在add.c这个源文件中定义函数体
{
return x+y;
}
//在test源文件中:
#include<stdio.h>
int main()
{
printf("%d ",Add(2,3));//在test.c中不可以直接调用add.c文件中的函数
return 0;
}
这个时候,就会报错,因为此时的函数是静态的,不能跨文件使用
11.指针
什么是指针?
在计算机中,每个字节(即房间)都会有一个地址(房间号),这里的地址就是起到房间号的作用,即变量存放的位置,而计算机就是通过地址找到某个变量的,一个房间号“指向一个房间”,对应到计算机上就是一个地址“指向”一个变量。
在变量前面加上&,就表示变量的地址。
#include<stdio.h>
int main()
{
int a = 1;
printf("%d, %d", &a, a);//&a就是取a的地址
return 0;
}
12.结构体
结构体的定义很简单
struct Name{
//一些基本的数据结构或者自定义的数据类型
};
例如,我们要存储一个学生的学号、性别、姓名。就可以这样定义:
struct student{
int id;
char gender;
char name[10];//姓名是字符串,我们用数组来存储
};