C语言指针与结构体:内存地址、访问与操作详解
C语言的指针与结构体是核心数据类型。理解内存地址分配是掌握指针的前提,而结构体则用于将不同类型的数据组合。本文将演示如何通过取址运算符获取变量地址,定义整型指针并进行解引用修改值,同时展示学生信息结构体的创建及通过 . 和 -> 操作符访问成员的具体实现。
理解指针与内存基础
第1步:了解内存单元与地址分配
内存是程序运行的关键存储器。为了有效管理,系统将内存划分为大小为1字节的小单元,并为每个单元分配唯一编号,即内存地址。这使得CPU可以通过地址精确访问数据。
第2步:获取变量的内存地址
当在内存中创建变量时,编译器会分配空间,该空间也有对应的地址。在C语言中,可以使用取址运算符 & 来提取变量的起始地址。对于多字节的变量(如 int 占4字节),系统通常返回占用空间最小的那个字节的地址(低地址)。打印地址建议使用格式控制符 %p,以符合平台相关的地址格式。
#include <stdio.h>
int main()
{
int num = 10;
// 取出num的地址
#
// 使用%p打印地址
printf("%p\n", &num);
return 0;
}
第3步:定义与使用指针变量
指针变量是一种专门用来存放其他变量地址的变量。定义时需明确指针指向的数据类型,这决定了进行解引用操作时对数据的解释方式。
#include<stdio.h>
int main()
{
int num = 10;
// 定义一个指向int类型的指针变量 p
// * 表示 p 是一个指针,int 表示其指向的数据类型
int* p;
// 将 num 的地址赋值给 p
p = #
return 0;
}
在实际使用中,我们可以通过指针修改变量的值:*p 称为解引用操作符。执行 *p = 20 时,程序会定位到 p 中存储的地址,并将该位置的数据由 10 修改为 20。
#include <stdio.h>
int main()
{
int num = 10;
int* p = #
// 通过指针间接修改数值
*p = 20;
printf("%d\n", num); // 输出结果为 20
return 0;
}
第4步:确定指针变量的大小
指针的大小取决于目标平台的架构。在32位系统上,地址总线宽度通常为32位,指针大小为4字节;在64位系统上,指针大小则为8字节。以下代码可用于验证不同数据类型的指针所占空间:
#include <stdio.h>
int main()
{
// %zu 用于打印无符号整型的大小
printf("%zu\n", sizeof(char*));
printf("%zu\n", sizeof(short*));
printf("%zu\n", sizeof(int*));
printf("%zu\n", sizeof(double*));
return 0;
}
结构体的定义与操作
第1步:构建包含多种数据类型的结构体
结构体(struct)允许程序员将不同类型的相关数据组合成一个整体。C语言使用 struct 关键字定义这种自定义类型。定义时需列出所有成员及其数据类型,并用花括号括起来。
假设需要记录学生的详细信息,可以按如下方式定义结构体模板:
struct Stu
{
char name[20]; // 名字
int age; // 年龄
char sex[5]; // 性别
char id[15]; // 学号
};
第2步:初始化与成员访问
定义结构体变量后,可以通过两种方式访问其内部成员:
- 点操作符 (.):直接用于结构体变量。
- 箭头操作符 (->) :仅用于结构体指针,它代表“先解引用再取值”的组合操作。
#include<stdio.h>
int main()
{
// 定义并初始化结构体变量 s
struct Stu s = { "张三", 18, "nan", "220210101" };
// 1. 使用点操作符访问变量成员
printf("%s\t%d\t%s\t%s\n", s.name, s.age, s.sex, s.id);
// 2. 使用箭头操作符访问指针成员
struct Stu* ps = &s; // 获取 s 的地址赋给指针 ps
printf("%s\t%d\t%s\t%s\n", ps->name, ps->age, ps->sex, ps->id);
return 0;
}
注意事项:箭头操作符 -> 只能在已经拥有结构体指针的情况下使用,不能直接用于普通的结构体变量对象。
以上就是C语言指针与结构体的详细内容,更多关于C语言指针与结构体的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













