目录
c语言的框架
变量
数据类型
格式化输出语句
符号
语句
条件语句
循环语句
小语句
函数
数组
指针
指针与函数
指针与数组
简单来说,c语言的主要组成部分为头文件和主函数构成,头文件为#include,主函数是int类型的函数:int main
变量在c语言的地位很高,类似于我们一段话的文字,通过c语言的语法共同构成c语言
当然变量即为可变的量,我们都应该给它取一个名字(标识符)标识符只需要自己认清即可,所以我们在使用变量的过程中,我们应该进行定义。变量有三部分构成:变量名,变量值和存储单元(地址)
我们在定义过程中格式非常简单:数据类型 标识符;
变量赋值的过程中可以先定义变量1再赋值,也可以边赋值边定义(常用for)
int a;
for(a=1;a<10;a++)
for(int a=1;a<10;a++)
在变量定义和函数定义的过程中,都不能缺少定义过程中的数据类型
最常用的就是基本类型
在不同的数据类型,输出语句的符号也有所不同
%d :十进制整数 int对应
%lld :长整形整数 longlong对应
%c :字符 char对应
%s :字符串(c语言中,一个位置就是一个字符)char数组对应
%f :小数 float对应
%lf :小数 double对应
printf("普通字符输出格式符", 输出项);
再c语言中,我们可以通过一个标识符号作为一个常量
#define 标识符 常量值 (书写格式)其实是和const int 标识符=常量的效果是一样的
有些符号是为了计算,其实符号的主要作用是简化
1.算术运算符中比较简单但需要注意几点
符号主要包括:加减乘除取余,自增自减
怎么获得一个数的百位,十位和个位
num/100
可以获得,因为 int
是整数型,小数部分会省略。比如 765/100
的结果是7
num%100/10
。比如765%100
先得到65
,65/10
得到6
num%10
。765%10
得到5
2.赋值运算符
其实赋值运算符就是从最简单的赋值=开始的
+=、-=、*=、/=、%=
这些演变过来的赋值运算符,其实就是在赋值过程中的省略,因为赋值的过程是右边赋值到左边,所以前面符号的操作就是左边的变量值与右边的变量值进行运算再通过等于赋值到左边
3.关系运算符
关系运算符最大的作用就是进行判断
在判断过程中需要注意的时候,那些在判断的过程中省略的操作就是用1,0进行判断真假
4.逻辑运算符
逻辑就是与,或,非
与:&&(数学中为且)
或:||
非:!
语句主要分为条件语句和循环语句
条件语句的核心为if-else
if(判断语句){
判断执行的地方
}else{
判断执行的地方
}
if嵌套的语句中,语义为:如果表达式为真,则执行,否则继续判断,直到判断出来为止;
循环总共有三种循环:
while循环;do-while循环;for循环。
while()
{
执行操作
}
while循环可以理解为:当(进行判断)真就循环,否则输出;
do-while循环可以理解为:先进行一步操作,当(进行判断),若真就进行循环,否则不循环;
for循环分为三步操作(进行的变量的初始化之后进行判断,若真则进行循环,然后对变量进行递增或者递减,知道判断语句为假的时候输出语句
多重循环
在循环嵌套里
我们首先应该考虑父循环和子循环或者还有孙子循环,最大的循环做一步,相邻小一步的循环就要全部完成
在循环嵌套中,我们最容易完成的事情是图形打印,可以使得嵌套式循环更加直观
例1:矩形
#include
int main()
{
// 3行4列的矩形
// 外循环控制行数
for (int i = 0; i < 3; i++) {
// 内循环控制列数
for (int j = 0; j < 4; j++) {
printf("*");
}
printf("\n");
}return 0;
}
运行如下
例2:三角形:内循环的条件表达式随着外循环的i值变化
#include
int main()
{
/*
最多打印5行
最多打印5列
由于:列数<=行数
*/
for(int i = 0; i< 5; i++) {
for(int j = 0; j <= i; j++) {
printf("*");
}
printf("\n");
}return 0;
}
运行结果:
若是将三角形到过来:内循环的初始化表达式随着外循环的i值变化
初始值是0,循环五次,1循环四次,所以初始值随着i变化
#include
int main() {
for (int i = 0; i < 5; i++) {
for (int j = i; j < 5; j++) {
printf("*");
}
printf("\n");
}
return 0;
}
运行结果
冒泡排序
#include
int a[10];
int cont = 0;
int main() {
//数组的初始化
for (int i = 0; i < 10; i++) {
printf("请输入第%d位数:", i);
scanf("%d", &a[i]);
}
//进行排序
for (int i = 10; i > 0; i--) { //第一层循环只是为了控制次数
for (int j = 0; j < i - 1; j++) {
if (a[j] > a[j + 1]) {
cont = a[j];
a[j] = a[j + 1];
a[j + 1] = cont;
}
}
}
for (int i = 0; i < 10; i++) {
printf("%d ", a[i]);
}
}
冒泡排序需要注意的是双循环之后有一个操作就是赋值排序操作利用变量作为中介进行大小排序
进行赋值操作。
1.break
break的作用为跳出当前循环,所以首先break必须存在于循环当中,然后当前循环的意思是,在嵌套式的语句中,只能跳出break当中的一个小循环
2.continue
continue的作用是结束当前循环进行下一个循环
break是跳出当前整个循环,continue是结束本次循环开始下一次循环。
3.swich-case
switch(表达式){
case 常量表达式1:
语句1;
break;
case 常量表达式2:
语句2;
break;
case 常量表达式n:
语句n;
break;
default:
语句n+1;
break;
}
例子:
#include
int main() {
int num = 3;
switch(num){
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期日\n");
break;
default:
printf("回火星去\n");
break;
}
}
注意:default可以省略,但是break不能省略!!
if和swich的区别:if的针对范围比较强,swich对于特殊值的针对性比较强
在此之前,我们所有的操作都是在主函数当中进行,输入输出,循环判断等等操作,我们是否可以自己搭建一个函数,来完成简化主函数当中的重复操作呢
函数的自创:
数据类型 函数名称(形参)
{
执行代码;
return 表达式;
}
最需要注意的是return:执行函数体中的程序段所取得的并返回给主调函数的值。
return后面跟的可以是一个表达式进行计算,也可以是变量返回。
例子,前100的和递归
#include
int sum(int n) {
if(n==1){
return n ;
}return n + sum(n - 1);
}
int main() {
printf("%d", sum(100));
return 0;
}
数组是一种存储空间,数组内部存储数据,这个空间就是数据的地址
一个数组是从0开始,首先掌握的应该是数组的初始化操作和输出
#include
int main() {
int i, a[10];
for (i = 0; i <= 9; i++)
a[i] = i;
for (i = 9; i >= 0; i--)
printf("%d", a[i]);
return 0;
}
这是常规的0123456789的逆输出
我们还可以对数组进行赋值输出
int a[10];
for (int i = 0; i < 10; i++) {
printf("请输入第%d位数:", i);
scanf("%d", &a[i]);
}
for (int i = 0; i < 10; i++) {
printf("%d ", a[i]);
}
这个操作就是将数组的每一项进行输入,然后根据你所写的内容进行输出
注意:在数组定义的过程中,需要注意的是,数组长度过长所以用longlong定义数组
二维数组
二维叔祖和一维数组类似,需要两个循环进行定义
例1:若自己定义一个二维数组,且输入x,y即可找出数组的位置(因为数组默认是从0开始,则数组的值减去1为元素的位置
#include
int a[10][10];
int main()
{
int n,m;
printf("每行每列控制为:");
scanf("%d,%d",&n,&m);
printf("该二维数组为:\n");
for(int i=0;i
这串代码先输入一个二维数组(自己创造了一个数组),找见了这个数组中任意一项的位置
其实刚刚接触指针的时候,我们一直奇怪的一个点是指针是什么,它到底想要做什么,让我们慢慢揭开指针神秘的面纱吧!
在我们刚刚接触c语言的时候,其实指针已经显现出来,变量,变量由三种组成部分:变量名,变量值和存储单元(地址),那么,什么是指针
在计算机中所有数据都存储在内存单元中,而每个内存单元都有一个对应的地址, 只要通过这个地址就能找到对应单元中存储的数据.
由于通过地址能找到所需的变量单元,所以我们说该地址指向了该变量单元。将地址形象化的称为“指针”
内存单元的指针(地址)和内存单元的内容是两个不同的概念。
但是,地址就是我们平常使用的指针吗?
其实我们在使用指针的过程中,指针也是需要定义的——指针变量,它和大多数的变量是一样的,就是一种变量,但是在我们运用指针的过程中,我们所说的是这个指针指向什么什么(什么意思),其实指针变量所指向的是变量值,变量所存储的是指向这个变量值所存在的地址
指针变量的定义:所指向的数据类型 * 标识符
int *p
但是在写程序的过程中,问题又又又来了
*和&
我们可以这么理解,*是指针变量的一部分,表指向
取值符号(代表访问指针所指向存储空间)
&是取地址符号
int a = 5;
int *p = &a;
printf("a = %d", *p); // 访问指针变量
我们在使用的过程中,一定要对于指针变量进行赋值,哪怕是Null
int a = 5;
int *p;
p=&a;
int *p=NULL;
int *q=0;
一定要注意的是,指针变量只可以存储地址,不能存储其他(所以说我们在scanf过程中缺少&是不会报错的,因为会把&的后面当作地址)
函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。
int (*fun)(int x,int y);
(我也不大会)
指针变量最为函数参数
int swap(int *p1,int *p2)
#include
void swap(int *p1, int *p2) {
int p;
p = *p1;
*p1 = *p2;
*p2 = p;
}
int main() {
int a, b;
int *c, *d;
scanf("%d,%d", &a, &b);
c = &a;
d = &b;
if (a < b) {
swap(c, d);
}
printf("%d,%d", a, b);
return 0;
}
在我们学习数组的时候我们其实不难想象:在定义数组的时候,我们也把数组当成一个变量,数组我们其实一直把它当作一个数据库来装数据,其实并不难联想到指针。
那数组怎么用指针表示呢?
我们先分析一下数组和指针:int a[i] (定义a为包含十个整型数组数据的数组)
int *p (定义p为指向整型变量的指针变量)
若p=&a[0]就是将a[0]元素的地址给p(这有什么用呢?)其实编译器在定义数组的时候a就是第一个元素的地址
所以p=a。就是数组对指针的转换。
数组的面纱揭开,那我们定义数组的时候是不是又多了一种方法:
我们可以这样理解:我们将a作为第一个变量的地址,i作为偏移的地址所以
int a[i];
//有的编译器不让这样命名,[]内只能写常量
int *(a+i);
(你不需要知道,只需要记住)a和i挪下来,a=p
最后一点,数组和指针完全一样吗?即使他们都所指向地址,但数组还是一串数所指向是稳定的,但指针是一个变量,是随时可以变化的。
操作一下指针打印数组吧!
#include
int main() {
int a[10];
int i;
int *p;
for (i = 0; i < 10; i++) {
scanf("%d", &a[i]);
}
printf("\n");
for (p = a; p < (a + 10); p++) {
printf("%d", *p);
}
return 0;
}
肝不动了(打游戏了)。。。明天继续!!!
因为内容太过简单,希望大佬能够指点一fan、、