C语言初阶第六篇:初步认识指针、结构体 最强指针入门教学

雄关漫道真如铁,而今迈步从头越
老铁们,今天的学习分享是指针和结构体的初步认识,我们到了指针的进阶内容时,会更加详细的说明指针的,包括数组指针,函数指针,函数指针数组,有兴趣的读者也可以先看看笔者以前的博客:

数组指针、指针数组、函数指针和函数指针数组

那么今天就先来看看指针以及结构体是个什么东西吧!

一、说起指针就不得不提内存

1、一个内存单元有多大?

一个 内存单元是一个字节,也就是一个char类型容器的大小。
char c : byte = 8bit

2、内存单元的编号如何产生?

我们要明白,机器是分16位,32位和64位的。目前常见的应该就是32位和64位的机器,我们以32位机器为例,来看一看内存编号如何产生:
32位机器:
想象出32根地址线/32根数据线(物理意义上的电线)
在这里插入图片描述
32位的计算:
在这里插入图片描述
在这里插入图片描述
a的地址也就是第一个字节的地址来寻找得到。
想必现在小伙伴们应该明白每个内存单元都有编号了,而我们就把这种编号称为指针。

二、保存地址的变量–指针

有了地址当然是好事情,这让我们能更快速的找到变量,那么我们如果想保存地址,该怎么办?这时候我们就需要一个新的变量类型:指针

在开始正式的说指针之前,我们依然有一些准备工作要做,了解两个操作符:" & " 和 " * "

简要的理解:& 就是取出地址,* 就是取出地址里的内容。

至于要讲的使用,我们就给两个使用的实例,就能看懂了。更详细的指针教学,我们会放在进阶里介绍,初阶我们只简要的说一说指针,就当开胃小菜了。

1、指针

使用的示例代码如下:

#include<stdio.h>
int main()
{
	int a = 10;//4byte  一个int型就申请了4字节的空间
	int* pa = &a;//pa是用来存放地址的,所以我们把pa称为指针变量
	*pa = 20;//这里的*,就是解引用操作符,它的意思就是通过pa中存放的地址,找到pa所指向的内容
	printf("%d\n", a);
	return 0;
}

在这里插入图片描述

2、解引用

在这里插入图片描述
*,就是解引用操作符,它的意思就是通过pa中存放的地址,找到pa所指向的内容

三、指针变量的大小

我们先看一段代码:

#include<stdio.h>
int main()
{
	char ch = 'w';
	int a = 10;

	int* pa = &a;
	char* pc = &pc;
	
	printf("%d\n", sizeof(pa));//4
	printf("%d\n", sizeof(pc));//4  注意,这跟机器有关,地址线是32根,所以就是8*4 四个字节大小
	//指针变量的大小并不取决于指向谁,而取决于地址本身(看系统位数,64位平台就是8字节大小的地址)
	return 0;
}

运行结果如图:
在这里插入图片描述
那么理由我们在注释里也给的很清楚了,这里再说一遍:

指针大小跟机器有关,地址线是32根,所以就是8*4 四个字节大小。指针变量的大小并不取决于指向谁,而取决于地址本身(看系统位数,64位平台就是8字节大小的地址)。

理解这句话至关重要,也就是指针的大小是固定的,可不要犯错误啊。

四、结构体

今天的最后,就分享一下初步的结构体的知识吧,又想了解更多结构体知识的,可以点击这篇链接(包含内存对齐):
结构体、结构体传参与其内存对齐、位段
这篇文章,由于是初阶内容,就说一些简单的:
结构体是C语言中特别重要的知识点(比如在链表中应用),结构体使C语言有能力描述复杂类型。

比如描述学生,学生包含 姓名-年龄-性别-学号这几项信息

#include<stdio.h>
//比如描述学生,学生包含 `姓名 - 年龄 - 性别 - 学号`这几项信息
struct Stu {
	char name[20];//名字-字符串
	int age;//年龄
	char sex[5];//性别-字符串
	char id[20];//学号-字符串
};
void Print(struct Stu* ps)
{
	//结构体指针->结构体成员(访问)
	printf("%s %d %s %s\n", ps->name, ps->age, ps->sex, ps->id);
}
int main()
{
	//结构体变量
	struct Stu s1 = { "张三",19,"男","123456789" };//学生1
	struct Stu s2 = { "李四",18,"女","987654321" };//学生2
	//结构体.结构体成员(访问)
	printf("%s %d %s %s\n", s1.name, s1.age, s1.sex, s1.id);
	Print(&s2);
	return 0;
}

运行结果如图:
在这里插入图片描述

那么今天的分享也就到这里了,之后我们就逐层深入,慢慢透析C语言!

  • 25
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值