雄关漫道真如铁,而今迈步从头越
老铁们,今天的学习分享是指针和结构体的初步认识,我们到了指针的进阶内容时,会更加详细的说明指针的,包括数组指针,函数指针,函数指针数组,有兴趣的读者也可以先看看笔者以前的博客:
那么今天就先来看看指针以及结构体是个什么东西吧!
一、说起指针就不得不提内存
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语言!
文章评论