C语言指针&结构体&分支和循环

一、指针

1.1、指针的使用

1、内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。
2、所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节(1Byte)
3、为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址

  • 变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。
  • 指针的例子如下:
#include<stdio.h>
int main()
{
    
    
	int num=0;				//向内存申请4个字节,存储0
	&num;					//取出num的地址
	//注:这里的num的四个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
	printf("%p\n",&num);	//打印地址,%p是以地址的形式打印

	int *p=&num;			//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语言有九种控制语句。可分成以下三类:

  1. 条件判断语句也叫分支语句:if语句、switch语句;
  2. 循环执行语句:do while语句、while语句、for语句;
  3. 转向语句: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语句的判断部分。进行下一次循环的入口判断。

猜你喜欢

转载自blog.csdn.net/m0_62670778/article/details/131465672