C语言指针与结构体基础:从内存地址到复杂数据定义
指针与结构体是C/C++语言学习中的核心难点。指针用于处理内存地址,而结构体用于组合多个不同类型的变量。掌握这两者不仅能有效管理内存资源,还能灵活描述如学生档案等复杂的业务对象。
一、 指针基础与内存模型
指针本质上是存储内存地址的变量。在计算机运行时,程序数据都加载在内存中。为了高效访问,内存被划分为以字节(Byte)为基本单位的存储单元,每个单元拥有唯一的编号,即内存地址。
理解以下关键点:
- 取地址:使用
&运算符获取变量的首字节地址(对于多字节类型如 int,系统通常分配连续空间)。打印时建议使用%p格式符。 - 解引用:使用
*运算符配合指针变量名,可以访问该地址指向的内存中的数据并对其进行修改。
#include <stdio.h>
int main()
{
// 变量num占用4个字节(通常为int),编译器为其分配内存并赋予地址
int num = 10;
// &num 取出 num 的地址(第一个字节的地址)
printf("num的地址: %p\n", &num);
// 定义整型指针 p,将其指向 num 的地址
int* p = #
// 通过解引用 *p 修改 num 的值
*p = 20;
printf("解引用后的值: %d\n", *p); // 输出 20
return 0;
}
在指针的大小方面,它取决于操作系统和编译平台的寻址能力,而非其指向的数据类型:
- 32位平台 (X86):指针占用 4 个字节(32 bits),因为地址总线为32位。
- 64位平台 (X64):指针占用 8 个字节(64 bits),地址空间更大。
可以通过 sizeof 验证不同数据类型指针的空间大小:
#include <stdio.h>
int main()
{
// 无论指向 char, int 还是 double,指针本身的大小仅由平台位数决定
printf("char* size: %ld\n", sizeof(char *));
printf("int* size: %ld\n", sizeof(int *));
return 0;
}
二、 结构体的定义与应用
当需要表示具有多种属性关联的复杂实体(例如一名学生的姓名、年龄、性别和学号)时,可以使用结构体(Struct)。它将不同的数据类型打包在一起,形成一个自定义的复合数据类型。
第1步:定义结构体模板
使用 struct 关键字声明结构体名称及其包含的成员变量。
struct Stu {
char name[20]; // 名字
int age; // 年龄
char sex[5]; // 性别
char id[15]; // 学号
};第2步:创建实例并初始化
定义结构体类型后,可以像普通变量一样创建其实例并进行赋值。
struct Stu s = { "张三", 20, "男", "20180101" };第3步:访问结构体成员
C语言提供了两种主要方式访问成员:
.操作符:直接通过结构体变量名访问,例如s.age。->操作符:专门用于结构体指针。通过取地址(&s)将变量地址存入指针ps后,使用ps->age即可便捷读取或修改数据。
#include <stdio.h>
// ... 上文结构体定义代码 ...
int main()
{
struct Stu s = { "张三", 20, "男", "20180101" };
// 直接使用 . 访问
printf("使用 . : name=%s\n", s.name);
// 定义指针并通过 -> 访问
struct Stu* ps = &s;
printf("使用 ->: name=%s\n", ps->name);
return 0;
}
总结
指针操作让程序员能够精确控制内存,而结构体则极大地增强了C语言对现实世界复杂数据的建模能力。二者结合使用时,经常需要通过结构体指针来传递或修改对象内容。以上就是C语言一看就懂的指针与结构体介绍的详细内容,更多关于C语言入门与进阶的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













