Chinaunix首页 | 论坛 | 博客
  • 博客访问: 201722
  • 博文数量: 42
  • 博客积分: 2216
  • 博客等级: 大尉
  • 技术积分: 440
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-11 19:38
文章分类

全部博文(42)

文章存档

2013年(1)

2011年(9)

2010年(23)

2009年(9)

我的朋友

分类: C/C++

2010-04-08 17:50:18

以前以为自己会这个,今天用到的时候想当然地写了个程序,老是调不过去。折腾了挺长时间,下边把经验教训总结一下。
------------------
二维数组的动态分配
如动态生成一个ROW * COL的矩阵。其实有两种方法,一种是把二维数组看成一维的,然后一次性分配一个ROW*COL*sizeof(int)那么大的空间。另一种方法是先分配一个指针的数组,然后数组中每个指针再分配一个空间。这里主要介绍第二种方法。步骤如下:
1. int **p = (int **)malloc(sizeof(int*)*ROW); // 生成一个指向指针的指针
2. for (i=0; i
3.     p[i] = (int *)malloc(sizeof(int)*COL);
这样才可以,而不是像我开始想的那样直接int **p = (int **)malloc(sizeof(int*)*ROW*COL);

---------------
如果使用二维数组当做参数,如何写?
int function(int **p, int ROW, int COL, ...)
{
/* function sentences */
}
这么写对么?其实是不正确的,p是指向指针的指针,和二维数组名还是有区别的,如果你的确是想把二维数组当成参数,而不是一个**指针,那么应该这么写才正确:
int function(int (*p)[常量值], int ROW, int COL, ...)
{
/* function sentences */
}
注:"常量值"的位置必须是常量,否则编译器将不能确定这个数组的size。

另外,如果声明一个二维数组如
int data[][3] = {{1, 2, 3}, {4, 5, 6}};
那么如果设一个指针指向这个二维数组,这个指针该如何写?
int **p = data; // 这么写对么?
其实是不正确的,编译器给出一个warning:
'int ** ' differs in levels of indirection from 'int (*)[3]'
告诉我们int **类型和二维数组的int (*)[3]是不兼容的,是有区别的。
通过查看warning, 我们知道该怎么写了
int (*p)[3] = data; // 这样写就正确了
结论:二维数组名data的类型为int (*)[3]
-----------------
访问二维数组
可以使用p[i][j], 也可以使用*(*(p+i)+j), 也可以用*(p[i]+j), (*(p+i))[j]
没太大区别。
阅读(2636) | 评论(0) | 转发(0) |
0

上一篇:解密PDF文档

下一篇:换行符与回车符[转]

给主人留下些什么吧!~~