前言
续接上一篇文章,此篇继续对C语言的基础知识点进行更新。
C语言入门篇(一)
初始C语言
- 7. 选择语句
- 8. 循环语句
- 9. 函数
- 9.1 函数的定义
- 9.2 函数的调用
- 10. 数组
- 10.1 数组定义
- 10.2 数组的下标
- 10.3 数组的使用
- 11. 操作符
- 12. 常见关键字
- 12.1 关键字typedef
- 12.2 关键字static
- 13. #define定义常量和宏
- 14. 指针
- 14.1 内存
- 14.2 指针变量的大小
- 15. 结构体
- 结束语
7. 选择语句
什么是选择?
如果你好好学习,就能月入过万
如果你不好好学习,就只能继承“五毛”家产
用C语言表示:
#include<stdio.h>
int main()
{
printf("好好学习输入>1,不好好学习输入>0:");
int flag;
scanf("%d", &flag);
if (flag == 1)
printf("^。^恭喜你,月入过万");
else
printf("|^-^|,努力吧!少年");
return 0;
}
8. 循环语句
唧唧复唧唧,日复一日当练习。
循环语句分为三种:
- while语句
- for语句
- do…while语句
唐僧取真经要经历“九九八十一难”,每打怪一次,孙悟空的神力就提高一点,直到结束。接下来用上述三种循环来表示孙悟空的神力总值。
//while语句
#include<stdio.h>
int main()
{
int i = 10;//表示孙悟空初始神力
int j=0;//表示孙悟空总神力
while (j < i+81)
j++;
printf("%d", j);
return 0;
}
//for语句
#include<stdio.h>
int main()
{
int i = 10;
int j;
for (j = 0; j < i + 81; j++)
;
printf("%d", j);
return 0;
}
//do...while语句
#include<stdio.h>
int main()
{
int i = 10;
int j=0;
do
j++;
while (j < i + 81);
printf("%d", j);
return 0;
}
9. 函数
函数是 C 语言中的重要组成部分,它可以将程序分解为模块,提高代码的可读性和可维护性。
函数由函数头和函数体组成,函数头包括函数名、返回值类型和参数列表,函数体包括函数执行的语句块。
9.1 函数的定义
返回值类型 函数名(参数列表)
{
// 函数体语句块
}
其中,返回值类型是函数返回值的数据类型,函数名是函数的标识符,用于在程序中调用函数,参数列表是函数接收的参数,多个参数之间用逗号分隔。
例如,下面定义了一个名为 sum 的函数,它的作用是求两个整数的和并返回结果:
int sum(int a, int b)
{
int c = a + b;
return c;
}
9.2 函数的调用
在程序中调用函数时,需要提供函数名和实参列表。实参列表是实际传递给函数的参数,其数据类型和数量必须与函数定义时的参数列表一致。
例如,下面调用了 sum 函数,并输出了其返回值:
int a = 1, b = 2;
int c = sum(a, b);//调用
printf("sum(%d, %d) = %d\n", a, b, c);
……后面将会对函数做更深的介绍
10. 数组
如何存储多组数据?
10.1 数组定义
C语言中对数组的定义:一组相同类型元素的集合
int arr[5]={1,2,3,4,5};//定义一个整形数组,最多存放5个元素
char arr1[5];//定义字符数组
float arr2[5];//定义浮点类型数组
10.2 数组的下标
C语言规定:数组的每个元素都有一个下标,小标从0开始。
数组可以通过下标来访问单个元素的。
例如:
int arr[5]={1,2,3,4,5};//五个元素,下标范围是0-4
10.3 数组的使用
通过下标,可以对数组中的元素进行提取。
例如:将int arr[5]中的元素依次输出
#include<stdio.h>
int main()
{
int arr[5] = { 1,2,3,4,6 };
for (int i = 0; i < 5; i++)
{
printf("%d\n", arr[i]);
}
return 0;
}
运行结果:
11. 操作符
- 在C语言中:0表示假,非0表示真
算术操作符
+ - * / %(取余)
移位操作符
>> <<
位操作符
& ^ |
赋值操作符
= += -= *= /= &= ^= |= >>= <<=
int a=0;
a=10;
a=a+5; a+=5;//两个语句相同
a=a-2; a-=2;//两个语句相同
a=a*3; a*=3;//两个语句相同
单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(单位:字节)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 简洁访问操作符(解引用操作符)
(数据类型) 强制类型装换
// !
int main()
{
int a=1;
if(a)//a为真进入
printf("1");
if(!a)//a为假进入
printf("2");
return 0;
}
//sizeof
int main()
{
int a=1;
printf("%d\n",sizeof(a));//4
printf("%d\n",sizeof a);//4
printf("%d\n",sizeof(int));//4
//错误表示:printf("%d\n",sizeof int)
return 0;
}
//++ --
int main()
{
int a=5; int b=++a;
printf("%d %d\n",a,b);//6 6
int c=5; int d=c++;
printf("%d %d\n",c,d);//6 5
int e=5; int f=--e;
printf("%d %d\n",e,f);//4 4
int p=5; int q=p--;
printf("%d %d\n",p,q);//4 5
return 0;
}
//强制类型转换
int main()
{
int a=(int)3.1;
printf("%d",a);//3
return 0;
}
关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
逻辑操作符
&& 逻辑与-两哥操作数同为真才是真,只要有一个假,则为假
|| 逻辑或-两边同为假才是假,只要有一个真,则为真
条件操作符
exp1?exp2:exp3 //exp1为真,执行exp2,为假则执行exp3
逗号表达式
exp1,exp2,exp3,...expn
下标引用、函数调用、结构成员
[] () . ->
//结构体
struct stu
{
char name[20];
int num;
float score;
};
int main()
{
struct stu s1 = { "liming",01,89 };
struct stu s2 = { "lihua",02,96 };
struct stu s3 = { "lili",03,91 };
printf("%s %d %lf", s1.name, s2.num, s3.score);//引用结构体成员
}
//liming 2 91.000000
引用结构体成员三种方式:
- 结构体变量名.成员名
- 结构指针变量名->成员名
- (*指针变量名).成员名
12. 常见关键字
用户不能自己创造关键字
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
12.1 关键字typedef
typedef顾名思义是类型定义,这里应该理解为类型重命名。
typedef struct Node
{
int data;
struct Node* next;
}Node; //把struct Node叫做Node
12.2 关键字static
在C语言中: static是用来修饰变量和函数的
1.修饰局部变量称为静态局部变量
2.修饰全局变量称为静态全局变量
3.修饰函数称为静态函数
1.修饰局部变量–静态局部变量
void teat()
{
int a=5;
a++;
printf("%d",a);
}
int i=0;
while(i<10)
{
test();
i++;
}
return 0;
//6 6 6 6 6 6 6 6 6 6
//如果在 int 前加上static 则输出为 6 7 8 9 10 11 12 13 14 15
static修饰局部变量改变了变量的存储类型(位置),使得这个静态变量的生命周期变长了,直到程序结束。
2.修饰全局变量–动态全局变量
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。
全局变量具有外部链接属性,使用extern可以在其他源文件内部使用
static修饰全局变量,改变了这个全局变量的链接属性,由外边链接属性变为内部链接属性,导致不能跨文件使用。
3.修饰函数–静态函数(和static修饰全局变量是一样的)
//代码1
//add.c
static int Add(int x,int y)
{
return x+y;
}
//teat.c
int main()
{
printf("%d",Add(1,2))//3
return 0;
}
//代码2
//add.c
static int Add(int x,int y)
{
return x+y;
}
//teat.c
int main()
{
printf("%d",Add(1,2))//出现链接行错误
return 0;
}
一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
13. #define定义常量和宏
//define定义标识符常量
#define MAX 100
//define定义宏
#define ADD(x,y) ((x)+(y))
#include<stdio.h>
int main()
{
printf("%d\n", ADD(2, 3));//5
printf("%d\n", 10 * ADD(2, 3));//50
return 0;
}
14. 指针
什么是指针?
指针也就是内存地址,指针变量是用来存放内存地址的变量
指针相对于一个内存单元来说,指的是单元的地址,该单元的内容里面存放的是数据。在 C 语言中,允许用指针变量来存放指针,因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。
14.1 内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。
取出变量地址如下:
变量num在内存中的存放地址:
地址又是如何存储的呢? 需要定义一个指针变量
int num = 10;
int* p=#//p存放num的地址,是一个整型指针变量,即是存放地址的变量
*p = 20;//解引用操作符,*p就是num
指针的使用实例:
int main()
{
int num = 10;
printf("%p\n", &num);
int* p=#//p存放num的地址,是一个整型指针变量,即是存放地址的变量
*p = 20;//解引用操作符,*p就是num
printf("%d\n", p);
return 0;
}
14.2 指针变量的大小
#include <stdio.h>
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
printf("%d\n",sizeof(char*));
printf("%d\n",sizeof(short*));
printf("%d\n",sizeof(int*));
printf("%d\n",sizeof(double*));
return 0;
}
15. 结构体
结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。
比如描述学生,学生包含:名字+学号+分数这几项信息。
这里只能使用结构体来描述了。
struct Stu
{
char name[20];//名字
int num;//学号
float score;//分数
};
//打印结构体信息
struct Stu s={"wanger",101,96};
//.为结构体成员访问操作符
printf("name=%s num=%d score=%lf\n",s.name,s.num,s.score);
//->访问操作符
struct Stu *p=&s;//定义指针变量p类型
printf("name=%s num=%d score=%lf\n",p->name,p->num,p->score);
printf("name=%s num=%d score=%lf\n",(*p).name,(*p).num,(*p).score);
使用实例:
结束语
到这里初始C语言的内容就结束了,后面我将会对这些知识点进行拓展延伸,详细讲解。
山一程,水一程,感谢铁汁的关注~
我们下一篇文章再见。