结构体中的链表指针以及->的含义,内存角度理解最易懂

struct Node 
{
    int a,b;
};


上面定义了这样一个结构体

struct Node t = {1,2};

我们需要先理解这句话的含义。这样进行一个初始化,那么{1, 2},你可以认为是内存中的某块区域已经分配给你了,其中的值就是{1, 2}。而前面的t呢,就是这结构体的副本了,你可以认为t就是这个结构体。


struct Node *p;

这里和上面就不一样了。他是一个指针了。而且是一个指向的类型被限定为Node的指针。指针的意思就是指向哪一块内存区域。


我们这里要做的就是让他指向上面那个结构体。

还记得取地址符吗?我们可以通过它来获取结构体的在内存中的位置。&t

所以p直接指向这个地址就可以了 。

p = &t;

为什么可以这样做呢?就需要理解指针了。当你定义了一个指针后,上面的p就是指向的地址,p*就是内存地址中的值了。


那么现在p就指向{1, 2}的那快内存空间了。怎么从中取出这两个数呢?

p -> a;

这个就是{1, 2}中的1了。

其实就是p->a中包含了两个指向。p是指向{1,2}的那块区域,->a又是指向这块区域中的1。(这里我思考了一会,发现结构体中的 int没有用指针的形式定义,所以p->a就是直接指向1了。


所以->其实也相当于指针,只不过指向的是结构体自身的元素在内存中的位置



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优化以下代码,要求:班级成绩管理系统 (1)利用结构和简单的链表,实现一个班学生成绩的管理,至少可以输入20个学生的成绩。 (2)成绩管理功能包括:输入、输出,利用new和delete运算符添加和删除班级成绩 (1)利用结构和简单的链表(关于链表的知识,自己查阅资料学习),实现一个班学生成绩的管理。#include<stdio.h> #include<iostream> #include<windows.h> using namespace std; typedef struct student { char name[20]; int score; student* next; }stu; stu* head; void input() { stu* p1, * p2; p1 = (stu*)new stu; head = p1; while (p1 != NULL) { cout << "输入姓名" << endl; cin >> p1->name; cout << "输入成绩" << endl; cin >> p1->score; cout << "是否继续输入?(1.是 2.否)"; int a; cin >> a; if (a == 1) { p2 = p1; p1 = (stu*)new stu; p2->next = p1; continue; } else if (a == 2) { p1->next = NULL; break; } } } void listprint() { stu* p1 = head; while (p1 != NULL) { cout << 1; cout << "姓名: " << p1->name << " 成绩:" << p1->score << endl; p1 = p1->next; } } void shanchu() { char c[20]; cout << "请输入删除的学生姓名" << endl; cin >> c; stu* p1 = head, * p2; while (p1 != NULL) { p2 = p1->next; if (strcmp(p2->name, c) == 0) { p1->next = p2->next; break; }p1 = p1->next; } } int main() { int a = 0; while (1) { cout << "1.输入成绩 2.输出成绩 3.删除" << endl;cin >> a; switch (a) { case 1: { input(); system ("cls"); continue; } case 2: { listprint(); continue; } case 3: { shanchu(); continue; } default: { break; } } break; } }
03-11

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值