这个问题我纠结了蛮久了,因为前面一直忙(自己也懒了点),所以没有能好好研究这个。希望这篇文章能够帮助你们。

 #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

作者:名不见
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.

最新文章

  1. winAPI 检查系统设备拔插使用 WM_DEVICECHANGE 消息
  2. LeetCode - Populating Next Right Pointers in Each Node
  3. 关于EJB的理解
  4. MPlayerX——MAC OS 最好用的播放器
  5. XAMPP端口占用启动不了
  6. [Android Pro] Android studio jni中调用Log输出调试信息
  7. BZOJ2190: [SDOI2008]仪仗队
  8. nexus启动不了
  9. (转) Crittercism: 在MongoDB上实现每天数十亿次请求
  10. 一步一步学数据结构之n--n(图遍历--深度优先遍历--非递归实现)
  11. JavaScript新手学习笔记1——数组
  12. android重要的对象
  13. Hibernate学习之检索策略
  14. Oracle新建实例后,修改sys和system密码。
  15. 使用Oracle数据库实现树形结构表的子-父级递归查询和删除,通过级联菜单简单举例
  16. apache 安装/mod_dir.so: undefined symbol: apr_array_clear
  17. laravel 还原项目到正常状态
  18. 20190412 T-SQL语言一
  19. loj6062 pair
  20. selinux 设置的彻底理解 并要 熟练经常的使用

热门文章

  1. 互评Beta版本(Hello World!——SkyHunter)
  2. 文件名命工具类(将指定目录下的文件的type类型的文件,进行重命名,命名后的文件将去掉type)
  3. 剑指offer:替换空格
  4. “吃神么,买神么”的第一个Sprint计划(第六天)
  5. 微服务负载均衡 —— ribbon
  6. react 组件构建设计
  7. 6/6 sprint2 看板和燃尽图的更新
  8. debug阶段贡献分
  9. php $_SERVER[&#39;HTTP_USER_AGENT&#39;] 2
  10. JavaScript的setTimeout()和setInterval()