指针 对象 结构体

本文探讨了C语言中结构体的内存布局及其访问方式。通过具体的实例代码,展示了不同类型的成员变量如何在内存中排列,并解释了如何通过指针访问这些成员变量。
struct b 
{
int x;
};
struct b structB = { 222 };


struct a
{
unsigned int MemStartAddr;
unsigned int MemEndAddr;
int CountNum;
struct b* p1;
};
struct a structA = { 2, 3, 4, &structB };


struct a* p = &structA;
int a0 = *((int*)p); 
int a1 = *((int*)p + 1);
int a2 = *((int*)p + 2);
struct b** a3 = (struct b**)((int*)p + 3);
int bx = (*a3)->x;
### C语言中指针结构体指针的定义与使用 #### 指针的基础概念 在C语言中,指针是一种变量,用于存储另一个变量的内存地址。通过指针可以间接访问该变量的内容。声明一个指针时需要指定其数据类型,以便编译器知道如何解释所指向的数据。 ```c int *p; // 声明了一个指向整型的指针 p float *q; // 声明了一个指向浮点数类型的指针 q ``` 当操作指针时,可以通过解引用运算符 `*` 来获取它所指向的值[^1]。 #### 结构体基础 结构体是一组不同类型数据项的集合,在C语言中允许用户自定义复杂的数据类型。结构体中的每一个成员都有自己的名字独立的数据类型。 ```c struct Stu { char name[20]; short age; }; ``` 上述代码片段展示了如何定义一个名为 `Stu` 的结构体,其中包含了两个成员:一个是字符数组 `name` 表示姓名;另一个是短整型 `age` 表示年龄[^2]。 #### 结构体指针的定义与初始化 为了更高效地处理大型结构体或者传递参数给函数,通常会使用指向结构体指针来代替整个结构体本身。这样不仅可以减少不必要的拷贝开销,还能提高程序性能。 以下是关于结构体指针的一些基本用法: - **定义方式** 定义一个指向特定结构体类型的指针非常简单,只需在其前加上星号即可表示这是一个指针变量。 ```c struct Stu s1 = {"李四", 28}; // 创建并初始化一个结构体实例 struct Stu *ps = &s1; // 将 ps 初始化为指向 s1 的指针 ``` - **成员访问** 使用箭头符号 (`->`) 可以方便快捷地通过指针访问结构体内某个字段而无需先取出实际的对象再调用点(`.`)操作符。 ```c printf("%s %d\n", ps->name, ps->age); ``` 或者也可以显式地利用圆括号加星号的方式完成同样的功能: ```c printf("%s %d\n", (*ps).name, (*ps).age); ``` 这两种写法效果完全一致,但在大多数情况下推荐前者因为它更加简洁直观。 #### 实际应用案例分析 下面给出一段完整的示范代码展示如何综合运用这些知识点构建简单的应用程序逻辑: ```c #include <stdio.h> #include <string.h> // 定义书籍信息结构体 struct Book { char title[50]; float price; }; void displayBook(struct Book *bookPtr); int main(){ struct Book myBooks[]={ {"C Programming Language",9.99}, {"Advanced Data Structures",14.75} }; int i=0; while(i<sizeof(myBooks)/sizeof(myBooks[0])){ displayBook(&myBooks[i]); ++i; } return 0; } // 显示单本图书详情的方法实现 void displayBook(struct Book *bookPtr){ printf("Title : %s\nPrice:%f$\n", bookPtr->title, bookPtr->price ); } ``` 此例子说明了怎样借助于循环遍历多个相同类型的实体(这里是两本书),并通过传入它们各自的地址到辅助打印子例程里去简化主流程控制语句的设计思路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值