希望每一个想开始而又不敢开始的人,对任何知识都不要抱有恐惧,觉得它很神秘,那样不好,知识就在那里一动不动,一层薄纱,掀开它,你将看见新的世界。 ——我的实习老师
数组
什么叫数组呢,我们在编程中想要用一个东西存储1—10的数字怎么办呢?
在c语言中也有着相关的解决工具——数组
数组的定义:一组相同类型元素的几何(只要类型相同,什么类型都可以)
1.1数组的创建
数据类型 数组名 [数组的大小] ={放入数组内的合适的数据}
例如:int arr [5] = {1,2,3,4,5};
解析: int — 数组内放置的数据类型为整型;
arr — 博主给数组取得数组名;
5 — 数组最多能放置5个元素(数据)
有人看见博主讲解括号内5代表最多放置5个元素,结合博主的例子可能会产生疑问,
为什么要加个最多呢?难道还可以不放置5个元素吗?那干嘛要写个5呢?
其实数组是为了创建一个集合,类似于我们开一个俱乐部或者培训班等等,我们定会员的个数为300人
但是刚刚创建的时候,知名度不高,只有100人报名参加,因此后面随着大家的宣传,以及真材实料,发现嘿!这个俱乐部不错嘞,让更多志同道合的人都来参加,也自然人数就会慢慢向300人靠,达到300人也达到了我俱乐部会员个数的阈值也就是300。
这时可能有人会好奇,我要是定义大小为5,只放置3个,是一种什么状况呢?
我们来看看下面的调试过程展现
我们定义了三个数组,分别是arr、b、c,最大个数都为5,但给arr放置了5个整型的数据,给b放置了3个整型的数据,c放置了0个整型的数据。
大家在调试的监视窗口可以看见:
arr数组的值字段依次按顺序放置的是0、1、2、3、4、5,
b数组的值字段为0、1、2、0、0,(数组的不完全初始化)
c数组的值字段为0、0、0、0、0,(数组的完全初始化)
由此可以得出结论:数组是向内存申请一个空间,连续存放你输入的值,放多少放什么都是可以改变的,当没有数据放入时,剩余的元素则初始化为0。
这时细心的朋友还会发现,在监视窗口内的名称字段下三个数组每个数组的展开都会有一串序号0,1,2,3,4,而这就不得不讲一讲这串序号了
👇👇👇👇👇👇👇
1.2数组的下标
在c语言中规定:每一个数组的每一个元素都会有一个对应的下标,且下表都是从0开始向数组阈值排列的。
如下:
int main ()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
//对应的下标: 0 1 2 3 4 5 6 7 8 9
return 0;
}
而这除了能给放入数组的数据进行一个排序、编号还有什么用呢?
1.3数组的使用
既然每个元素都编号排序了,当然是可以通过下标来访问的,类似于我们去银行或是点餐的号牌,不过数组的下标访问可不用排队,而是根据你选择的下标来选择对应的元素
使用方法如下:
#include <stdio.h>
int main()
{
int arr[5] = { 1, 2, 3, 4, 5 };
//对应的下标: 0 1 2 3 4
printf("%d",arr[2]);//arr数组内下标为2的元素 即 3
printf("%d",arr[4]);//arr数组内下标为4的元素 即 5
return 0;
}
此处printf函数内的arr[2]、arr[4],和上面定义数组arr的arr[5]的含义完全不同
函数内的数组的方括号内的数字代表着下标,而不是数组的大小。
printf函数内arr[2]、arr[4]:打印该数组下标为2和下标为4相对应的元素
操作符
只做大致的了解,在初学c语言中可能会用到的操作符会有避坑介绍,以认识为主。
2.1算数操作符
+ | 有时作为加号有时作为正数 |
- | 有时为减号有时作为负数 |
* | 乘号 |
/ | 除号(有坑) |
% | 取模或取余(有坑) |
2.1.1”/“、”%“ 避坑介绍:
#include <stdio.h>
int main()
{
// ”/“
//1.整数除法
printf("%d\n", 15 / 2);
//2.带有浮点数的除法(只要除号两边有一个浮点数即可)
printf("%f\n", 15.0 / 2); //7.500000
printf("%f\n", 15 / 2.0); //7.500000
printf("%f\n", 15.0 / 2.0); //7.500000 c语言中 浮点数 默认保留6位小数
//”%“
printf("%f\n", 15.0 % 2.0);//完全错误的写法
//取余就是取余数 两边的数字都为整数
printf("%f\n", 15 % 2); // 1 1是因为15除以2得7余1,因此也叫取余
return 0;
}
2.2移位操作符(移动的二进制的位)
>> | 向右移 |
<< | 向左移 |
2.3位操作符
& | 按位与 |
^ | |
| | 按位或 |
2.4赋值操作符
单赋值 | 释义 |
= | 等号,赋值或初始化 |
int main()
{
int a = 0 ;//初始化
a = 10;//赋值
return 0;
}
复合赋值 | 释义 |
+= | "a+=3"等同于”a=a+3“ |
-= | "a-=3"等同于”a=a-3“ |
*= | "a*=3"等同于”a=a*3“ |
/= | "a/=3"等同于”a=a/3“ |
&= | 暂接触不到 |
^= | 暂接触不到 |
|= | 暂接触不到 |
>>= | 暂接触不到 |
<<= | 暂接触不到 |
2.5单目操作符
两边只有一个操作数的为单目操作符,上图中左右两个操作数的为双目操作符
! | 逻辑反操作 |
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度(以字节为单位) |
~ | 对一个数的二进制按位取反 |
-- | 前置("--a"等同于“a-1=a“)、后置("a--"等同于“a=a-1“) |
++ | 前置("++a"等同于“a+1=a“)、后置("a++"等同于“a=a+1“) |
* | 间接访问操作符(解引用操作符) |
(类型) | 强制类型转换 |
2.5.1 ”!“
在c语言中
int main()
{
int flag = 5;
int a = 0;
if (flag)
printf("呵呵\n");
if (!flag)
printf("哈哈\n");
if (a)
printf("heh\n");
if (!a)
printf("haha\n");
//此时打印出呵呵和haha
//因为0为假,而逻辑判断为当flag为真则打印呵呵,当a为非0则打印haha
return 0;
}
2.5.2 sizeof
用来计算操作数的类型长度的,创建一个变量求变量的大小和求该变量的类型的大小是一样的。
#include <stdio.h>
int main()
{
//求变量的大小
int a = 10;
printf("%d\n", sizeof(a)); //4个字节
printf("%d\n", sizeof(int));//4个字节
//求数组的大小
int arr[5] = { 1, 2, 3, 4 , 5};
printf("%d\n", sizeof(arr)); //20字节
printf("%d\n", sizeof(arr[1])); //4字节
//此处sizeof内的arr[i],i=0_4都可以,i是下标,数组内的每个元素大小相等
//求某数组的内元素的最大阈值
printf("%d\n", sizeof(arr) / sizeof(arr[1]));//5个
return 0;
}
2.5.3 ”++“,”--“
只是让变量+-1,前后置皆可
需要使用变量得话:
前置为:先++/--再使用变量
后置位:先使用变量再++/--
#include <stdio.h>
int main()
{
int a = 10;
int b = a++;//后置++
printf("a = %d", a);//a=11
printf("b = %d", b);//b=10
//原因是此处变量a先赋值10,b=a++,后置++,先使用,再++
//即 先使b = a = 10,再++变成a = a + 1,即a =11
int c = 10;
int d = ++c;//此时前置++,先++在使用
printf("c = %d", c);//c=11
printf("d = %d", d);//d=11
//即先++为c = c + 1 =11,再使用得b=c=11
return 0;
}
2.5.4 (类型)
当给变量赋值不属于该变量类型的值时,如下图,
因为给变量a定义的整型,而后面的值3.14为浮点型,不匹配
这时我们使用强制类型转换操作符,就不会出现警报,因为将3.14强制让编译器认为是整型。
我们来看看可能出现问题的地方:
int main()
{
int a = (int)3.14;
printf("%d\n",a);//此时结果为3
//这是可能有人认为是相当于编译器给四舍五入了,但这是错误的
int b = (int)3.99;
printf("%d\n", b);//此时结果还是为3,因为强制转为整型后编译器只取整数部分
return 0;
}
2.6关系操作符(用于判断条件语句)
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
!= | 用于测试是否”不相等“ |
== | 用于测试是否”相等“ |
2.7逻辑操作符
&& | 逻辑与(并且)(两边的条件同时为真才为真,只要有假则为假) |
|| | 逻辑或(只要有真即为真,两边同时为假则为假) |
举个栗子:
年龄在18~30岁之间的青年在c语言中的表示
age >=18 && age<=30
景区年龄在5岁之下和60岁之上的可以免单在c语言中的表示:
age<5 || age>30
2.8条件操作符
条件操作符也叫三目操作符,也是c语言中唯一的一个三目操作符
exp1?exp2:exp3 | 表达式1为真时,执行表达式2,表达式1为假时,执行表达式3 |
int main()
{
int a = 3;
int b = 5;
int m = 0;
//此时我们通过比较来将a和b中较大值放入m中,
if (a > b)
m = a;
else
m = b;
printf("%d", m);// 5
//我们用条件操作符来表达上面的逻辑
m = (a > b ? a : b);//5
//当a>b为真时,m取a,当a>b为假时,m取b。
return 0;
}
条件复杂不建议使用三目操作符。
2.9 逗号表达式
exp1,exp2,exp3……expn
是 由逗号隔开的一串表达式
实战解析:
int main()
{
int a = 3;
int b = 5;
int c = 0;
int d = (a += 3, b -= a, c = a + b, c - 2);//3
//a+=3得到6,b = b-a =-1,c = a+b = 5,c-2 = 3 即d = 3
return 0;
}
结论:逗号表达式是从左向右依次计算,整个表达式的结果是最后一个表达式的结果
2.10 下标引用、函数调用和结构成员
[] | 在数组中可用于创建数组和下标引用 |
() | 函数调用操作符 |
-> | 暂时不讲 |
. | 暂时不讲 |
🙆🙆🙆
🏠 文章节束 🏠
🙆🙆🙆
如有纰漏还请各位斧正,如果对你有帮助的话还请点个赞支持一下博主,谢谢你!!!
如果有什么疑问或不同的见解,欢迎评论区留言嗷👀