初识C语言(四)

本篇文章是初识C语言系列的最后一篇文章,本篇文章主要简单认识一下指针和结构体

目录

1.指针

1.1 指针的使用:

1.2 指针变量的大小

 2.结构体

2.1结构体的使用和结构体变量的创建

2.2结构体指针


1.指针

要学习指针,就得理解内存  指针就是用来访问内存的
內存
內存是电脑上特别重要的存取器,计算机中程序的运行都是在内存中进行的
所以为了有效的使用内存,就把内存划分为一个个小小的内存单元,每个内存单元的大小是1个字节
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的的地址
在C语言中 地址编号也是叫指针    编号 == 地址 == 指针  三个表达的意思相同

编号

在计算机上,有地址线,也就是物理的电线
可传递高低电平的信号,转换为数字信号:高电平为1,低电平为0。所以计算机采用2进制,每个信号(1/0)是一个二进制位,也就是bit位
32位计算机,上面有32根地址线,每个地址线会传递一个数字信号,所以会产生2的32次方个不同的信号编号,这些编号可以管理2的32次方个字节,4GB的内存,就是可以为每个字节进行编号,可以通过编号找到他们在内存中的位置。我想肯定会有人问,为什么以字节为单位编号,那是因为我们所学的数据类型中char字符型所占内存最小,为一个字节,所以字节为单位最好。
现在计算机一般是64位,这样可以管理更多的内存。

1.1 指针的使用:

//程序运行起来,要加载到内存中,也要申请内存空间使用
int main()
{
	int a = 15;//a是int类型
	//所以向内存中申请了4个字节的空间 来存放15这个数值
	//虽然a占用4个字节,但我们&a的时候,拿到的是4个字节中的的第一个字节的地址
	
	//%p - 专门用来打印地址的,是16进制的形式表示地址的
	printf("%p", &a);//&取地址符,拿到a的地址


	int* pa = &a;//pa用来存放a的地址,是一个变量,叫指针变量  意思是存放指针的变量
	// * 是为了表示 pa 是一个指针变量
	//int 是为了表示 pa 指向的是 int 类型的变量

	//可以通过地址找到a
	*pa = 30;// * 解引用操作符,*pa就是a

	printf("%d\n", a);//打印30;
	//提供了另一种方式对a进行操作

	return 0;
}

指针 - 地址 - 编号  三个意思相同
指针变量 - 是一个变量 - 就是存放地址的变量
口头语中说的指针,基本上都是指针变量。

1.2 指针变量的大小

指针变量是用来存放地址的
32位机器:地址是32个2进制位,也就是32个bit位,1个字节8个bit位,所以这个地址要存储的话要4个字节。所以在32个机器上,指针变量的大小是4个字节
64位机器:64个2进制位,这个地址要存储的话要8个字节。

所以,指针变量的大小与它指向的数据的类型是没有关系的,它的大小只与操作系统的位数有关。

int main()
{
	int a = 10;
	int* p = &a;
	printf("%d\n", sizeof(p));//32 4个字节   64位  8个字节
	printf("%d\n", sizeof(int*));//32 4个字节   64位  8个字节
	return 0;
}

 在VS2022编译器上,可以自己改变编译环境位数。x64位64位环境,指针变量大小为8个字节。x86为32位环境,指针变量大小为4个字节。

 2.结构体

 char short int 等数据类型是比较单一的
不足以描述一些复杂类型,如学生,书
学生 :名字 年龄 性别等
书  : 书名 作者 定价
C语言中引入了结构体描述复杂对象   使用关键字struct

2.1结构体的使用和结构体变量的创建

//学生 结构体
struct Student//Student为结构体名称,可以随意设置
{
	//学生的相关属性   结构体成员
	char name[20];//名字—字符串  ,一个汉字是2个字符
	int age;//年龄
	char sex[5];//男 女 保密     数组长度[5]是因为保密4个字符 \0一个字符
};

//书 结构体
struct Book
{
	//结构体成员
	char name[20];
	char auther[10];
	float price;
};

int main()
{
    //创建结构体变量s   struct Student为结构体类型
	struct Student s = {"西兰花",19,"男"};//s 学生结构体变量
	struct Book b = { "《初识C语言》","西兰花",66.6f };//b 书结构体变量
	//.操作符 通过结构体变量访问结构体成员
	printf("%s %d %s\n", s.name, s.age, s.sex);
	printf("%s %s %f\n", b.name, b.auther, b.price);
	//这里价格浮点型数据,会精度丢失,不能准确打印,后期会讲

}

2.2结构体指针

struct S//S结构体类型
{
	char name[20];
	int age;
	float score;
};

void print1(struct S t)
{
	//第一种访问结构体成员写法
	//语法:  结构体变量.成员
	printf("%s\n%d\n%.2f\n", t.name,t.age,t.score);
}

void print2(struct S* ps)
{
	//第二种访问结构体成员写法
	//语法:  结构体变量.成员     与第一种相同,解引用结构体指针得到的也是结构体变量,
	printf("%s\n%d\n%.2f\n", (*ps).name, (*ps).age, (*ps).score);//.的优先级比 * 高,所以加()
	//第三种访问结构体成员写法
	//语法:  结构体指针->成员
	printf("%s\n%d\n%.2f\n", ps->name, ps->age, ps->score);//->
}
int main()//先执行main函数
{
    //创建结构体变量
	struct S s = { "是个西兰花",20,99.9f };
	print1(s);//调用自己编写输出函数
	print2(&s);//这里传入的是结构体变量的地址,&s,取出s的地址
	return 0;
}

初识C语言系列结束,后面文章会对每个模块进行详细讲解,谢谢大家支持。

猜你喜欢

转载自blog.csdn.net/qq_72916130/article/details/130172249
今日推荐