1
sNullp 2013-08-04 10:29:50 +08:00
NO YOU CANT
|
3
timonwong 2013-08-04 10:41:17 +08:00
不论几维数组存储方式都是线性。
|
4
itfanr OP 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) ; } } } |
7
felix021 2013-08-04 11:45:30 +08:00
原型应该用这样,少一个星号:
void myPrint (const int *vect, int row, int col); C语言里二维数组的每个元素都是连在一起的。 |
8
icenan2 2013-08-04 12:42:44 +08:00 1
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"); } } |
10
leavic 2013-08-04 15:28:52 +08:00
二维数组在内存中也是连续的吧
|
12
xdeng 2013-08-04 18:57:52 +08:00 via iPhone
指针。 没有什么 做不到
|
13
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"); } |
15
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]); } } } |
19
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 *, 而 |
20
pright 2013-08-06 11:58:15 +08:00
所以要强转啊
|
21
xiaoye5200 2013-08-06 14:08:07 +08:00
void myPrint(const int *vect, int len)
{ int i=0; for(;i<len;i++) printf("%d",*vect++); } int main() { int a [3] [2] = {{1,2},{3,4},{5,6}} ; myPrint(&a[0][0],sizeof(a)/sizeof(int)); } 为什么都喜欢用双重循环呢 |
22
itfanr OP @xiaoye5200 指针的指针呢
|
23
jiych 2013-08-06 17:31:53 +08:00
@pright 是的,多谢提醒
printf("%p ", vect+i);改为 printf("%p ", (const int*)vect+i);就可以了 |
24
xiaoye5200 2013-08-06 18:24:32 +08:00
@itfanr 关键没必要用指针的指针
|
25
Gal3rielol 2013-08-07 00:01:57 +08:00
@xiaoye5200 指针的指针是错误的, 不是没必要而是错误的.
|
26
xiaoye5200 2013-08-07 02:33:46 +08:00
@Gal3rielol
1,lz要的其实是如下代码。 2,指针的指针当然不是错的。 #include <stdio.h> void myPrint (int **vect, int row, int col) { int (*p)[2]=(int(*)[2]) vect; for (int i=0; i<row; i++) for (int j=0; j<col; j++) printf("%d\n",p[i][j]); } int main(int argc, const char * argv[]) { int a [3] [2] = {{1,2},{3,4},{5,6}} ; myPrint((int**)a, 3, 2); return 0; } |
27
itfanr OP @xiaoye5200 额 不是有没有必要 我只是有个疑惑,大家帮忙而已啊
|
28
Gal3rielol 2013-08-07 10:48:29 +08:00
@xiaoye5200 既然你说指针的指针是对的又为什么要强转呢?
|
29
pright 2013-08-07 14:10:55 +08:00
@itfanr 因为标准是这样的,某类型的数组只会转换为该类型的指针,对应二维数组只会转换为一维数组指针,int[3][2]->int(*)[2]。所以要么按内存排布自己处理,要么强转回原始类型
729 Except when it is the operand of the sizeof operator or the unary & operator, or is a string literal used to initialize an array, an expression that has type “array of type” is converted to an expression with type “pointer to type” that points to the initial element of the array object and is not an lvalue. http://c0x.coding-guidelines.com/6.3.2.1.html |