1.数组
我们存储一个数是用一个变量就可以,例如: int a = 10;但如果要存储十个数呢?这里我们就引入了数组。
定义:一组想同类型元素的集合。
1.1数组的创建: 数据类型 数组名[ const_ ] ;
注意:const_ 是字面常量、const修饰的常变量、#define 定义的常量,不可是变量!!
例如:存储10个整数就可以创建一个整型数组。------> int arr[10] = {1,2,3,4,5,6,7,8,9,10};
1.2数组的下标
上面已经创建了数组,那么该如何访问数组中的元素呢?答案是用下标。而下标是从0开始的!
例如:访问上面数组中的6就是5号下标;即 arr[5] =6;
1.3数组的使用:
#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\t",arr[i]);
}
return 0;
}
2.操作符
声明:这里仅仅是初识即大概认识不讲的太细,后面会把操作符一一详解的;
操作符分为算术操作符,赋值操作符,逻辑操作符和位操作符等;
2.1算术操作符:+ - * / %
+ - * 和数学中的一样;
/ 又叫取商; % 叫取余(模);
好,举个栗子:
#include<stdio.h>
int main()
{
int a = 5;
int b = 3;
int add = a + b;//加
int dis = a - b;//减
int mul = a * b;//乘
int q = a / b;//商
int w = a % b;//取余
printf("%d %d %d %d %d ",add,dis,mul,q,w);
return 0;
}
运行结果:
2.2移位操作符:<< >>
#include<stdio.h>
int main()
{
int a = 15;
int i = 0;
int count = 0;
for (i = 0; i < 32; i++)
{
if ((a>>i) % 2 == 1)
{
count++;
}
}
printf("count = %d\n", count);
return 0;
}
代码运行结果:
2.3位操作符
& | ^
后面操作符详解会详细说明!这三个可是很有用的,很多高级算法都是他们实现的!
2.4赋值操作符
2.5单目操作符
![](https://i-blog.csdnimg.cn/blog_migrate/1becd08e98028c59a074dd7894e2d93f.png)
举个栗子:
#include<stdio.h>
int main()
{
int a = 2;
int b = 1;
printf("%d\n", sizeof(a));//4
printf("%d\n", sizeof(int ));//4
printf("%d\n", sizeof a);//4
int s = ++a;//3
printf("%d %d\n", a,s);//3 3
int m = b++;//2
printf("%d %d\n", b,m);//2 1
return 0;
}
运行结果:
2.6关系操作符
> < != >= <=
2.7逻辑操作符
&& -----》逻辑与(并且) ||----------->逻辑或(或者)
废话不多说,代码演示:
#include<stdio.h>
int main()
{
int y = 0;
scanf("%d", &y);
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
{
printf("Y");
}
else
{
printf("N");
}
return 0;
}
这是一个判断是否是闰年的代码正好运用了&&和||:
2.8三目操作符
语法: 表达式1 ? 表达式2 :表达式3;
解释:如果表达式1 成立则结果是表达式2,表达式2的结果是整个程序的结果;否则结果是表达式3,整个程序的结果是表达式3;
#include<stdio.h>
int Max(int x, int y)
{
return x > y ? x : y;
}
int main()
{
int a = 3;
int b = 5;
printf("%d\n", Max(a, b));
return 0;
}
代码运行结果和解释:
2.9逗号表达式
表达式1,表达式2,表达式3,表达式4......,表达式n;
逗号表达式是一连串的表达式,整个表达式的结果是最后一个表达式的结果!
举个栗子:
#include<stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 5;
int d = (a += 2, b -= 1, c = a + b, c--);
//a = 3 b = 1 c = 4 c = 3
printf("a = %d\nb = %d\nc = %d\nd = %d", a, b, c, d);
return 0;
}
运行结果以及代码解释:
2.10下标引用,函数调用和结构体成员
[ ] ( ) . ->
后面说明(指针和结构体那里);
3.关键字
C语言中有32个关键字(如下),这些关键字是语言本身设定好的,用户不能自己创建的字。例如,你不能定义一个变量 变量名用 if case 等。
因为目前还是初识阶段,就先介绍几个,后面会一个一个的说明;
3.1关键字typedef
顾名思义,typedef就是类型的定义也就是重新命名;
举个栗子:
#include<stdio.h>
typedef unsigned int uint_n;
int main()
{
unsigned int num = 10;
uint_n num2 = 20;
printf("%d\t%d", num, num2);
return 0;
}
代码解释:
3.2关键字static
在C语言中static 是用来修饰变量核函数的,具体有三种情况:
1.static 修饰局部变量-------静态局部变量
代码演示(未被static 修饰的):
//代码1
#include<stdio.h>
void test()
{
int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for (i = 1; i < 10; i++)
{
test();
}
return 0;
}
代码1打印的结果是 10个1
运行结果:
代码演示2(被static 修饰的)
#include<stdio.h>
void test()
{
static int i = 0;//静态变量
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for (i = 1; i < 10; i++)
{
test();
}
return 0;
}
这里是被static 修饰的局部变量 i 您先猜猜打印的结果是多少?
运行结果:
代码解释:
static 修饰的局部变量 ,程序还没有执行时就已经为变量开辟了内存空间:让我们ton过调试看一看:
程序刚刚调试起来还没有执行,i 中已经执行了i 和 i++ 。这就验证了上面所说的。
这里通过上面代码以及结果分析,static 修饰的局部变量延长了局部变量的生命周期,让局部变量出了作用域任然有效,直到程序结束其生命周期才结束!原因是:static 修饰的变量改变了局部变量的存储位置,本来局部变量是存储在栈上的但被static 修饰后变到了静态区延长了生命周期,但其作用域不改变!!!(下面是内存的大概分布图)
2.static 修饰全局变量 --------静态全局变量
未被static修饰的全局变量
上面这个例子说明了,局部变量有外部链接属性即使在其他原文件中也能使用(正确的方法使用extern 声明一下)。
被static 修饰的全局变量
根本编译不过去!说无法解析外部符号a ! 也就是说static修饰的静态全局变量改变了全局变量本来的外部连接属性,使其原本的外部链接属性变成了内部链接属性(只能本源文件中使用,不能再其他源文件中使用了),即其改变了全局变量的作用域。
3、static 修饰的函数---------静态函数
未被static修饰的函数
同全局变量一样,函数是具有外部链接属性的,只要使用方法正确(extern声明)就可以在外部文件中调用。
被static 修饰的函数
编译出错!无法解析Add函数。也就是和全局变量一样,static修饰的函数使函数原来的外部链接属性变成了内部连接属性,只能在本原文件中使用不能在其他语言文件中使用!
3.3#define定义的常量和宏
代码演示:
#define MAX 10 //#define 定义的常量
#define ADD(x,y) ((x) + (y))//#define 定义的宏
#include <stdio.h>
int main()
{
int s = ADD(3, 5);//8
printf("%d\n", s);
printf("%d\n", MAX);//10
return 0;
}
运行结果:
4.指针
内存是计算机中非常重要的存储器,计算机中的程序都是在内存中进行的!因此为了有效的使用内存,就把内存划分成为一个一个的内存小单元,每个内存单元是1个字节。为了能够有效的使用每个内存单元,就给每个内存单元进行编号把这些编号叫作内存单元的地址。
我们知道变量是在内存中存储的,每个内存单元都有地址,所以创建一个变量也就会有地址,取地址如下代码:
#include<stdio.h>
int main()
{
int a = 10;
printf("0x%p\n", &a);
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位sizeof返回值size_t 是 unsigned int
32位sizeof返回值size_t 是 unsigned long long
由上面的两个栗子可以看出,指针的大小是由32位/64位平台决定的,32位平台下是4个字节,64位下8个字节!
5.结构体
C语言中存储一个变量用的是一个变量,存储多个向同类型的变量用的是数组,那么存储不同类型的数据例如:学生信息等改用什么呢?没错是结构体!!!
废话不多说直接代码演示:
#include<stdio.h>
struct Stu
{
char name[20];
int age;
char sex[10];
char id[15];
};
int main()
{
//结构体初始化
struct Stu s = { "张三",20,"男","22111009" };
//.操作符访问结构体成员
printf("name : %s\tage : %d\tsex : %s\tid : %s\n", s.name, s.age, s.sex, s.id);
//->操作符访问结构体成员
struct Stu* m = &s;
printf("name : %s\tage : %d\tsex : %s\tid : %s\n", m->name, m->age, m->sex, m->id);
return 0;
}
代码运行结果:
关于 . 和 ->操作符会详细讲解!