【C语言极简自学笔记】彻底搞懂指针与结构体(struct):从入门到实战

       指针是 C 语言的灵魂,也是众多开发者的 "噩梦"。它像一把双刃剑,既能让代码高效灵活,也能让程序陷入万劫不复的崩溃。本文将从内存视角出发,结合底层原理与实战案例,带你彻底掌握指针的核心逻辑。

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

内存
一个字节0xFFFFFFFF
一个字节0xFFFFFFFE
一个字节0xFFFFFFFD
............
一个字节0x00000002
一个字节0x00000001
一个字节0x00000000

 变量是创建在内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。

一、指针的本质:内存地址的具象化

指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,在使用指针存储其他变量地址之前,必须对其进行声明。指针变量声明的一般形式为:

type *name;

其中type是指针的基类型,它必须是一个有效的 C 数据类型,例如char、int、float等。而name是指针变量的名称,用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。以下是有效的指针声明:

int *p;   // 定义一个指向int类型的指针变量p
double *q; // 定义一个指向double类型的指针变量q
char *ch;//定义一个指向char类型的指针ch

 二、指针的基础操作与内存映射

1. 取地址运算符 &

int a = 10;//向内存申请四个字节来存储10
int *p = &a;//&为取地址操作符   int说明p指向的对象是int类型的    *说明p是指针变量
printf("%p\n",&a);

%p是以地址的形式打印

2. 解引用运算符 * 

int a = 10;
int *p = &a;
*p = 20;
//*是解引用操作符,意思就是通过p中存放的地址,找到P所指向的对象,*p就是p所指向的对象
printf("%d\n",a);

解引用操作符主要是通过指针修改内存中的值,最终a的值被改为20。 

三、指针变量的大小 

指针变量的大小取决于地址的大小,32位平台下地址是32个bit位,即4个字节,64位平台下地址是64个bit位,即8个字节
x64平台:

x86平台:

在 C/C++ 编程中,** 结构体(struct)** 是一种用户自定义的数据类型,用于将不同类型的数据组合成一个有机整体。它是面向对象编程的基础,也是理解复杂数据结构(如链表、树)的关键。本文将从基础到进阶,结合实例讲解结构体的用法。 

四、结构体的基础用法

1. 结构体的定义与声明

struct 结构体名 
{
    数据类型 成员1;
    数据类型 成员2;
    ...
};

示例:定义一个学生结构体

struct Stu
{
	char name[20];
	int age;
	char sex[10];
	char tele[12];
};

2. 结构体变量的创建与初始化

struct Stu
{
	char name[20];
	int age;
	char sex[10];
	char tele[12];
};

int main()
{
	struct Stu s = {"zhangsan",20,"nan","12345678900"};//声明变量并初始化
	printf("%s %d %s %s\n",s.name,s.age,s.sex,s.tele);//必须一一对应
	return 0;
}

输出函数中的.为.操作符, 结构体对象.成员名,

3. 结构体指针

通过指针访问结构体成员:使用->运算符     结构体指针变量->成员名

struct Stu
{
	char name[20];
	int age;
	char sex[10];
	char tele[12];
};
void print(struct Stu* ps)
{
	printf("%s %d %s %s",(*ps).name,(*ps).age,(*ps).sex,(*ps).tele);//()必须加
	printf("%s %d %s %s",ps->name,ps->age,ps->sex,ps->tele);
}
int main()
{
	struct Stu s = {"zhangsan",20,"nan","12345678900"};
	//.操作符    结构体对象.成员名
	printf("%s %d %s %s\n",s.name,s.age,s.sex,s.tele);//必须一一对应
	print(&s);
	return 0;
}

通过声明一个结构体指针变量,然后通过->操作符指向结构体对象的成员名,(*ps)是通过解引用操作符,指向结构体对象的成员名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值