C语言如何用指针的指针打印二维数组?

2013-08-04 10:28:11 +08:00
 itfanr
如 :

int a [3] [2] = {{1,2},{3,4},{5,6}} ;

函数原型;

void myPrint (const int **vect, int row, int col) ;

不采用这样的原型:

void myPrint(const int (*p)[2], int row) //当然此处row = 3 这种函数不灵活

谢谢啦~~~~~~~~~
2130 次点击
所在节点    C
30 条回复
sNullp
2013-08-04 10:29:50 +08:00
NO YOU CANT
itfanr
2013-08-04 10:34:27 +08:00
@sNullp why?
timonwong
2013-08-04 10:41:17 +08:00
不论几维数组存储方式都是线性。
itfanr
2013-08-04 10:43:08 +08:00
void main(){

int a [3] [2] = {{1,2},{3,4},{5,6}} ;
int *pa ;
int **ppa ;
for (int i = 0 ;i<3; i++)
{
for (pa = a[i]; pa - a[i]<2; pa++)
{
ppa = &pa ;
printf("%d ", **ppa) ;
}
}

}
itfanr
2013-08-04 10:46:24 +08:00
@timonwong 那你说我的想法能不能用子函数实现?
sNullp
2013-08-04 11:30:53 +08:00
@itfanr 数组名和指针不是完全一样的。。所以数组的维度不能通过别的变量来传递。但是如果是指针的指针则可以。
felix021
2013-08-04 11:45:30 +08:00
原型应该用这样,少一个星号:

void myPrint (const int *vect, int row, int col);

C语言里二维数组的每个元素都是连在一起的。
icenan2
2013-08-04 12:42:44 +08:00
void myPrint (const int **vect, int row, int col)
{
const int *array=(const int*)vect;
int i,j;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
printf("%d,",array[i*col+j]);
}
printf("\n");
}
}
jesse_luo
2013-08-04 14:20:12 +08:00
@icenan2 强转回来了哈哈……
leavic
2013-08-04 15:28:52 +08:00
二维数组在内存中也是连续的吧
itfanr
2013-08-04 18:33:13 +08:00
@icenan2 mark 改天我试试啊
xdeng
2013-08-04 18:57:52 +08:00
指针。 没有什么 做不到
jiych
2013-08-05 10:16:51 +08:00
找到地址,就找到了指针。
int
main(int argc, char **argv)
{
int a [3] [2] = {{1,2},{3,4},{5,6}} ;
int i,j;

dir = getenv("PWD");
printf("dir:%s\n", dir);

for(i=0;i<3;i++)
for(j=0;j<2;j++)
printf("%p ", &a[i][j] );
printf("\n");

myPrint((const int **)a, 3, 2);
exit(EXIT_SUCCESS);
}

void myPrint (const int **vect, int row, int col)
{
int i;
int j;

printf("in myPrint\n");
for(i=0;i<row*col;i++)
printf("%p ", vect+i);
printf("\n");
}
jiych
2013-08-05 10:17:56 +08:00
@jiych
上面代码
dir = getenv("PWD");
printf("dir:%s\n", dir);
是多余的
pright
2013-08-05 11:52:08 +08:00
用gcc的话可以用变长数组,不过不推荐
void myPrint(const int **vect, int row, int col)
{
int i, j;
int (*array)[col] = (int (*)[col])vect;

for (i=0; i<row; ++i)
{
for (j=0; j<col; ++j)
{
printf("%d ", array[i][j]);
}
}
}
itfanr
2013-08-05 16:36:12 +08:00
@pright 变长数组?vc好像不支持吧?至少为const
pright
2013-08-05 22:57:23 +08:00
@itfanr 很久不用vc了,没印象了,支持c99的话就有
pright
2013-08-05 23:04:18 +08:00
@jiych 这种方式在64位机器就不对了
Gal3rielol
2013-08-06 00:48:37 +08:00
凡是用双重指针传参的全部都是错的
一维数组的类型int []可以视为为 int *
二维数组里面的数据元素的类型并不是int *;

我把代码贴上来
#include <stdio.h>

void pretty_print(int *start, int row, int col)
{
for (int i = 0; i < row; ++i) {
for (int j = 0; j < col; ++j) {
int *address = start + i * col + j; //手动计算地址
printf("%d ", *address);
}
printf("\n");
}
return;
}

int main(int argc, const char **argv)
{
int a[3][2] = {{1, 2}, {3, 4}, {5, 6}};
pretty_print((&a[0][0]), 3, 2);

int **p;
*p = &a[0]; //编译器会报类型不匹配的Warning

return 0;
}

2维数组在内存中也是线性的布局, 正确的做法是拿到第一个元素的地址手动计算剩下元素的地址.

clang报的warning如下
warning: incompatible pointer types assigning to 'int *' from
'int (*)[2]' [-Wincompatible-pointer-types]
*p = &a[0];
^ ~~~~~
可以看到 *p的类型是int *, 而
pright
2013-08-06 11:58:15 +08:00
所以要强转啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/77926

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX