关于struct结构的取地址和取值问题

本文探讨了在C语言中使用struct结构时遇到的取地址和赋值问题。通过一个配电终端项目的实例,展示了如何定义struct结构,并进行初始化。代码示例解释了如何访问struct成员以及成员地址,揭示了struct变量、成员变量和数组在内存中的表示方式。

最近在做配电终端的一个项目 要用到许多struct结构,需要从eeprom中读入数据 ,struct结构的取地址和赋值问题没有搞清楚,故自己检测了一下:

程序如下:


#pragma pack(1)


#define SRTermParaType struct strSRTermParaType
struct strSRTermParaType
{
 struct  
 {
  char  D1;
  char   D2[2]; 
 }F1;       //终端通信参数 F1
 struct
 {
  char  Ip1;
  char Port1[2];
 }F3;       //主站IP地址和端口号  F3
};

void main()
{
 SRTermParaType srt={0,4,1,2,1,8};
 /*
 srt.F1.D1={1};
 srt.F1.D2={2,3};
 srt.F3.Ip1={10,11};
 srt.F3.Port1={19};
 */
 printf("srt.F3=%d /n",srt.F3);
 printf("srt.F1=%d /n",srt.F1);
 printf("&srt.F3=%d /n",&srt.F3);
 printf("&srt.F1=%d /n",&srt.F1);
 printf("srt.F1.D1=%d /n",srt.F1.D1);
 printf("&srt.F1=%d /n",&srt.F1);
 printf("srt.F1.D2=%d /n",srt.F1.D2);
 printf("srt.F1.D2[0]=%d/n",srt.F1.D2[0]);
 
}

 

 

结果如下:

srt.F3=524546

srt.F1=66560

&srt.F3=1245051

&srt.F1=1245048

srt.F1.D1=0

&srt.F1=1245048

srt.F1.D2=1245049

srt.F1.D2[0]=4

 

<think>好的,我现在需要处理用户关于数据结构复试面试问题的查询。首先,用户提供了系统级指令,要求生成相关问题并正确使用LaTeX格式。我需要确保回答结构清晰,符合用户要求。 首先,我需要回忆用户提供的参考引用。引用[1]提到逻辑结构存储结构的区别,引用[2]涉及聚类算法的优点。用户现在关注的是数据结构的复试问题,包括数据类型算法相关内容。 接下来,我应该整理数据结构面试中的常见问题。通常,这类问题包括基本概念如逻辑结构、存储结构,线性结构如数组、链表,树结构,以及排序算法等。同时,需要结合用户提到的数据类型算法,例如栈、队列、二叉树、图的遍历、排序算法复杂度等。 根据引用[1],逻辑结构与存储结构的区别是一个基础问题,需要详细解释。此外,线性表、链表、栈队列的实现应用也是常见考点。树结构中的二叉树遍历、平衡二叉树,以及图的最短路径算法都需要涵盖。排序算法如快速排序、归并排序的时间复杂度稳定性也是重点。 用户可能还希望了解算法设计相关的问题,比如动态规划、贪心算法的区别,哈希表的冲突解决方法等。需要确保每个问题都有明确的回答要点,并正确引用提供的资料。 在生成相关问题时,要覆盖数据结构的各个方面,确保问题多样且深入,帮助用户全面准备复试。同时,注意使用正确的LaTeX格式,例如时间复杂度应写成$O(n \log n)$,逻辑结构用$G=(V,E)$等。 最后,检查是否符合所有用户指令:使用中文,正确引用,生成相关问题结构清晰。确保没有遗漏任何系统级要求,如单独成段的独立公式行内数学表达式的格式。</think>### 数据结构复试面试常见问题解析 #### 一、基础概念 1. **逻辑结构与存储结构的区别** 数据的逻辑结构描述元素之间的抽象关系(如线性、树形、图结构),与计算机无关。例如图的逻辑结构可表示为$G=(V,E)$,其中$V$为顶点集合,$E$为边集合[^1]。 存储结构则是逻辑结构在计算机中的物理实现,如顺序存储(数组)或链式存储(链表)。 2. **数据类型与抽象数据类型(ADT)** - 数据类型:定义数据的取值范围及操作,如整型、浮点型。 - ADT:通过封装数据与操作描述逻辑特性,例如栈的ADT包含`push`、`pop`等方法。 #### 二、线性结构 1. **数组与链表的对比** - 数组支持$O(1)$随机访问,但插入/删除需$O(n)$时间; - 链表插入/删除时间复杂度为$O(1)$,但查找需$O(n)$。 例如链表节点定义: ```c struct Node { int data; struct Node* next; }; ``` 2. **循环队列实现原理** 利用模运算实现环形缓冲区,解决假溢出问题。队列空条件:`front == rear`,队列满条件:`(rear+1)%size == front`。 #### 三、树与图 1. **二叉树遍历的时间复杂度** 三种遍历方式(先序、中序、后序)均为$O(n)$,空间复杂度取决于树高,最坏情况为$O(n)$[^2]。 2. **Dijkstra算法步骤** 用于求解单源最短路径: $$dist[v] = \min(dist[v], dist[u] + weight(u,v))$$ 需配合优先队列实现$O((V+E)\log V)$时间复杂度。 #### 四、排序算法 | 算法 | 平均时间复杂度 | 稳定性 | 适用场景 | |------|----------------|--------|------------------| | 快排 | $O(n \log n)$ | 不稳定 | 大数据量随机分布 | | 归并 | $O(n \log n)$ | 稳定 | 外部排序 | | 堆排 | $O(n \log n)$ | 不稳定 | 实时系统 | 快速排序的分治思想可参考示例代码中的实现。 #### 五、算法设计 1. **动态规划与贪心算法的区别** - 动态规划要求子问题最优解能推导全局最优解; - 贪心算法通过局部最优选择,但不保证全局最优。 2. **哈希冲突解决方法** - 开放定址法:$h_i(x) = (h(x) + d_i) \mod m$ - 链地址法:桶+链表结构
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值