C语言指针&结构体&分支和循环
一、指针
1.1、指针的使用
1、内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。
2、所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节(1Byte)。
3、为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
- 变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。
- 指针的例子如下:
#include<stdio.h>
int main()
{
int num=0; //向内存申请4个字节,存储0
# //取出num的地址
//注:这里的num的四个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
printf("%p\n",&num); //打印地址,%p是以地址的形式打印
int *p=# //int 说明p指向的对象是int类型的,* 说明p是指针变量
//注:这里的p就是指针变量
//char ch='w';
//char *p=&ch;
*p=20; //将p指向的对象的值修改为20
//解引用操作符,意思是通过p存放的地址,找到p所指向的对象,*p就是p指向的对象。
return 0;
}
1、内存单元:编号 -> 地址 ->地址也被成为i指针
2、存放指针(地址)的变量就是指针变量
1.2、指针变量的大小
#include<stdio.h>
//指针变量的大小取决于地址的大小
//32位平台下地址是32bit(即4字节)
//64位平台下地址是64bit(即8字节)
int main()
{
printf("%d\n",sizeof(char *));
printf("%d\n",sizeof(short *));
printf("%d\n",sizeof(int *));
printf("%d\n",sizeof(float *));
printf("%d\n",sizeof(double *));
//大小都是4字节或者8字节
return 0;
}
- 不管什么类型的指针,都是在创建指针变量。
- 指针变量是用来存放地址。
- 指针变量的大小取决于以地址存放的时候需要多大的空间
二、结构体
- 结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。
- 比如描述学生,学生包含:名字+年龄+性别+学号这几项信息。
- 这里只能使用结构体来描述了。
struct Stu
{
char name[20]; //姓名
int age; //年龄
char sex[5]; //性别
char id[15] //学号
};
void print(struct Stu* ps)
{
printf("%s %d %s %s\n",(*ps).name,(*ps).age,(*ps).sex,(*ps).id);
//->
//结构体指针变量->成员名
printf("%s %d %s %s\n",ps->name,ps->age,ps->sex,ps->id);
}
void main()
{
struct Stu s= {
"zhangsan",20,'男',"12364674678"};
//结构体对象.成员名
printf("%s %d %s %s\n",s.name,s.age,s.sex,s.id);
print(&s); //print函数
return 0;
}
三、分支和循环
控制语句用于控制程序的执行流程,以实现程序的各种结构方式!它们由特定的语句定义符组成,C语言有九种控制语句。可分成以下三类:
- 条件判断语句也叫分支语句:
if
语句、switch
语句; - 循环执行语句:
do while
语句、while
语句、for
语句; - 转向语句:
break
语句、goto
语句、continue
语句、return
语句。
3.1、if语句
//语法结构
if(表达式)
语句;
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
- 如果表达式的结果为真,则语句执行。
- 在C语言中如何表示真假?
0
表示假,非0
表示真。
如果条件成立,要执行多条语句,怎一个使用代码块?
#include<stdio.h>
int main()
{
if(表达式)
{
语句列表1;
}
else
{
语句列表2;
}
return 0;
3.2、switch语句
- switch语句也是一种分支语句。
- 常常用于多分支的情况。
//switch语句
switch(整型表达式)
{
语句项;
}
//语句项,case语句
case 整型常量表达式:
语句;
break;
- 如果表达的值与所有的case标签的值都不匹配怎么办?
- 其实也没什么,结构就是所有的语句都被跳过而已。
- 程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。
- 但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
- 你可以在语句列表中增加一条default子句,把下面的标签
default:
- 写在任何一个case标签可以出现的位置。
- 当
switch
表达式的值并不匹配所有case
标签的值时,这个default
子句后面的语句就会执行。 - 所以,每个
switch
语句中只能出现一条default
子句。
3.3、while循环
while(表达式)
{
循环语句;
}
-
break在while循环中的作用:
- 其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。所以:while中的break是用于永久终止循环的。
-
continue在while循环中的作用:
- continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行而是直接跳转到whilei语句的判断部分。进行下一次循环的入口判断。