c动态分配结构体二维数组
这个问题我纠结了蛮久了,因为前面一直忙(自己也懒了点),所以没有能好好研究这个。希望这篇文章能够帮助你们。
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h> typedef struct LNode {
int F;
struct LNode* next;
}LNode, *LinkList;
int main()
{
LNode** map = (LNode **)malloc( * sizeof(LNode*) ); //分配5个结构体指针空间
for (int i = ; i < ; ++i) //这里循环对5个指针分配相应的空间
{
map[i] = (LNode *)malloc(*sizeof(LNode)); //分配10个节点空间
} for (int i = ; i < ; ++i)
for (int j = ; j < ; ++j)
{
(map[i] + j)->F = j;
}
for (int i = ; i < ; ++i)
{
for (int j = ; j < ; ++j)
{
printf("%d\t", (map[i] + j)->F);
}
printf("\n");
}
return ;
}
示例一:
示例一思想:1、分配结构体指针空间;
2、为指针指的地方分配相应节点数空间。
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h> typedef struct LNode{
int F;
struct Lnode* next;
}LNode,*pLNode;
int main()
{
LNode** map = (LNode **)malloc(*sizeof(LNode*));
LNode *tMap = (LNode *)malloc( * * sizeof(LNode));
for (int i = ; i < ; ++i)
{
map[i] = (LNode *)((char *)tMap + i * * sizeof(LNode));
}
for (int i = ; i < ; ++i)
for (int j = ; j < ; ++j)
(map[i] + j)->F = j;
for (int i = ; i < ; ++i)
{
for (int j = ; j < ; ++j)
{
printf("%d\t", (map[i] + j)->F);
}
printf("\n");
}
free(tMap);
free(map);
return ;
}
示例二:
示例二思想:1、分配结构体指针空间;
2、分配相应节点数的空间;
3、用指针数组来分割。
注:我刚开始写的是“map[i] = tMap + i * 10 * sizeof(LNode);”这么一句,由于这里tMap是LNode结构体指针,所以他移动为【i * 10 * sizeof(LNode)】*sizeof(LNode)。举个例子int *a; 那么a +3; 就是 "a指向的地址" + 3*sizeof(int)。所以,如果非要这样这样相加的话可以把tMap转换为char*类型的地址在相加,最后再强制类型转换,即如代码中所示map[i] = (LNode *)((char *)tMap + i * 10 * sizeof(LNode))。当然亦可如map[i] =tMap + i * 10。
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h> typedef struct LNode{
int F;
struct Lnode* next;
}LNode,*pLNode;
int main()
{
LNode** map = (LNode **)malloc(*sizeof(LNode*) + * * sizeof(LNode));
LNode *head = (LNode *)(map + ); //这里等价于map所指的地址加上5*sizeof(LNode*)
for (int i = ; i < ; ++i)
{
map[i] = head + i * ;
//这里原理类似,一定要理解int *a; 那么a + 3所指的地址就是"a指向的地址" + 3*sizeof(int)。 }
for (int i = ; i < ; ++i)
for (int j = ; j < ; ++j)
(map[i] + j)->F = j;
for (int i = ; i < ; ++i)
{
for (int j = ; j < ; ++j)
{
printf("%d\t", (map[i] + j)->F);
}
printf("\n");
}
free(map);
return ;
}
示例三:
这里是直接分配一大块空间,然后再用指针来分割的。只要理解前面两个了,这里并不难。
关于二维数组作为函数参数的用法可参见:http://www.cnblogs.com/Anker/archive/2013/03/09/2951878.html
c动态分配结构体二维数组的更多相关文章
- 【Java学习笔记之八】java二维数组及其多维数组的内存应用拓展延伸
多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...
- Java数组之二维数组
Java中除了一维数组外,还有二维数组,三维数组等多维数组.本文以介绍二维数组来了解多维数组. 1.二维数组的基础 二维数组的定义:二维数组就是数组的数组,数组里的元素也是数组. 二维数组表示行列二维 ...
- 【Java学习笔记之九】java二维数组及其多维数组的内存应用拓展延伸
多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...
- C++ 练气期之二维数组与矩阵运算
1. 前言 C++中的一维数组可以存储线性结构的数据,二维数组可以存储平面结构的数据.如班上所有学生的各科目成绩就有二个维度,学生姓名维度和科目成绩维度. 这样的表格数据可以使用二维数组进行存储. 当 ...
- C语言一维数组、二维数组、结构体的初始化
C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ...
- 用C语言关于学生管理系统的几种实现方法(一位数组,二维数组,指针,结构体)
一位数组: #include <stdio.h> #include<string.h> #define N 5 void luru(float s[],int n); void ...
- 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(四)
全系列Index: [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(一) [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(二) [原创]只学到二维数组和结构体,不用链表也能 ...
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...
- JAVA之旅(三)——数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想
JAVA之旅(三)--数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想 我们继续JAVA之旅 一.数组 1.概念 数组就是同一种类型数据的集合,就是一个容器 数组的好 ...
随机推荐
- 2017秋软工 - 本周PSP
1. PSP 2. PSP饼状图 3. 进度条 4. 累计进度图
- Daily Scrumming* 2015.10.31(Day 12)
一.今明两天任务表 Member Today’s Task Tomorrow’s Task 江昊 学习rails的HTTP控制 继续学习rails等项目工具 杨墨犁 学习semanticUI的用法,配 ...
- java(系统)实战1
在简单学习了java的布局和一些界面的绘制方法后,我便开始有了跟着视频和书本的知识学做一个简单的餐饮系统,才能激发自己的编程和不断巩固知识. 我简单说明一下本次做的系统很普通但具有实用性,是通过jav ...
- python处理xml实例
""" Author = zyh FileName = read_xml_1.py Time = 18-9-26 下午5:19 """ fr ...
- 《Spring1之第四次站立会议》
<第四次站立会议> 昨天:我把小组成员找到的写关于登录界面的代码加到了我的项目工程里,并对它有了一定的了解,已经能够编译运行了,得到了登陆的界面: 今天:试着做了一下主框架里的在线人数的显 ...
- SGU 223 little kings BSOJ2772 状压DP
1896 [SCOI2005]互不侵犯King [问题描述]在n*n(1<=n<=10)的棋盘上放k(0<=k<=n*n)个国王(可攻击相邻的8 个格子),求使它们无法互相攻击 ...
- ABP ModuleZero后台框架materialize禁止模拟select和checkbox
使用abp modulezero自带那个后台框架发现一个操蛋的问题,所有的select和checkbox都被改成div模拟的,虽然比原生美观,但有时候真的很难用. 比如说要用select做一个联动菜单 ...
- 二叉查找树ADT--C语言描述
首先给出此ADT的声明: struct TreeNode; typedef struct TreeNode *Position; typedef struct TreeNode *SearchTree ...
- 【最简单】不用ps也可以批量转换图片格式
不废话直接开始~ 1.新建文件夹,把需要转换的图片放进去,如图: 2.文件夹里建一txt文本,重点来了!txt文本的内容,如果是jpg转为png,则输入“ren *.jpg *.png”,同理png转 ...
- [转帖]ssd固态硬盘的Trim命令是什么?
ssd固态硬盘的Trim命令是什么? 收藏 分享 邀请 许多用户朋友在购买SSD的时候都会特别强调Trim,不过Trim是什么?做什么用的? 什么是Trim? Trim指令也叫disable ...