西西河

主题:【求助】向各位高手请教一个c语言中数组与指针的问题 -- 数值分析

共:💬84 🌺26 新:
全看树展主题 · 分页首页 上页
/ 6
下页 末页
家园 对,是在堆里而不是在栈里。
家园 感觉您这个就是Java那个搞笑的“二维数组”
家园 a[0][0] != *a (设a是二维数组)

可以试一下,其实 a[0][0]=*( (int *)a )。

家园 恩,不知道java里是怎么实现的。
家园 要看他这个多维数组怎么定义的

如果是按照他在main里面定义的

int a[5][5];

这个a就是数组的首地址,而不是多级间指,那么*a = a[0][0]。他这个混乱就在于主函数是按照多维数组定义,在函数f1调用的时候却又当作多级间指来处理的。

家园 你这个main里面

a[0][0] = *a,不过b[0][0] != *b。楼主原文中的a和你同样定义的,当然是a[0][0] = *a了。

你这个就是多维数组和多级间指的差别。不过这种a到b的转换太费劲,对于初学者而言也有点费解。多维数组在C里面直接定义个m*n的一维数组进行处理最简单。

家园 括兄可以写个小程序试一下

一维数组没问题,但多维数组就不行了。

家园 sample code

#include <stdio.h>

#include <stdlib.h>

int main()

{

int a[4][4];

int c[3];

a[0][0]=99;

c[0]=123;

printf("*a=%d,*((int *)a)=%d\n", *a, *((int *)a));

printf("*c=%d\n", *c);

//*a=2359088,*((int *)a)=99

//*c=123

}

家园 还真有点意思,看来是我搞错了

看来我的记忆有点错误。我这里也弄了个sample,

#include <stdio.h>

int f1(int *a);

main()

{

int a[5][5];

int i, j;

for(i=0;i<5;i++)

for(j=0;j<5;j++)

a[i][j]=(i+1)*(j+1);

f1(a);

printf("%d %d\n",*a,a[0][0]);

getchar();

}

int f1(int *a)

{

int i;

for(i=0;i<25;i++)

printf("I am here : %d\n",*(a+i));

return 0;

}

在main里面a不能当作int *使用,但可以作为int *传给f1。在C里面所谓的多维数组我从来是弄个m*n的一维数组处理的,动态分配内存也容易,十几年了。没想到多维还真不大一样。

还好开的药方没错。

家园 括兄的药方那是绝对无错

LZ的问题很有趣,我也趁机复习了一下C语言

家园 这个问题实在很有趣

数组名是什么?这是关键。这个东东不是指针,虽然有的书上说它是常数指针(const pointer),但叫它指针只能把读者彻底搞糊涂。见过一个指针满足 &p=p=*p 吗?要想真正理解多维数组,请运行下面的代码。

----------------------------------

int main()

{

int a[2][2], b[3][4][5];

a[0][0]=1;

b[0][0][0]=99;

// 2-dim example

printf("%d,%d,%d\n",a, (int *)a, (int **)a);

printf("%d,%d,%d\n",*a, *((int *)a), *((int **)a));

printf("%d,%d,%d\n",*a+1, *((int *)a)+1, *((int **)a)+1);

printf("%d,%d,%d,%d\n", &a,a,*a,**a); //Same output for &a, a, *a.

printf("%d,%d,%d,%d\n", &a+1,a+1,*a+1,**a+1); //Note the difference.

// 3-dim example

printf("%d,%d,%d,%d\n",b, (int *)b, (int **)b, (int ***)b);

printf("%d,%d,%d,%d\n",*b, *((int *)b), *((int **)b), *((int ***)b));

printf("%d,%d,%d,%d\n",*b+1, *((int *)b)+1, *((int **)b)+1, *((int ***)b)+1);

printf("%d,%d,%d,%d,%d\n", &b, b, *b, **b, ***b); //Same output for &b, b, *b, **b.

printf("%d,%d,%d,%d,%d\n", &b+1, b+1, *b+1, **b+1, ***b+1); //Note the difference.

}


本帖一共被 2 帖 引用 (帖内工具实现)
家园 java里的数组都是对象

要实现多维数组一般这样:

假设要创建一个3*4的二维数组。

int[][] a;//这个彻底是指针了

a = new int[3][];

for(int i = 0; i < a.length; i++) {

a[i] = new int[4];

}

搞笑的是对二维数组您也可以这样:

int[][] a;

a = new int[3][];

a[0] = new int[3];

a[1] = new int[2];

a[2] = new int[4];

当然,这肯定不是一个3*4的二维数组了。这个东西实在不好说是个N*M的二维数组

其实内存分配上和您的方法是一样的。

家园 这次复习C语言还是真学到点东西。扩兄请看下面的代码

非常有意思。

frnkl:这个问题实在很有趣

家园 透彻

透彻,真乃真知灼见

家园 你这个分配法有问题

这个分配法有问题,数组a的地址不连续

我修改一下,分配nx*ny的二维数组:

int *a=(int**)malloc(nx*sizeof(int*));

a[0]=(int*)malloc(nx*ny*sizeof(int));

for (int i=1;i<nx;i++)

{

a[i]=a[0]+ny*i;

}

释放时

free(a[0]);

free(a);

这样的好处是,二维数组的地址是连续的

比如你要初始化,就可以

memset(a[0],'\0',nx*ny*sizeof(int));

原来你那种分配法就不行。

再比如

*(a[0]+m*ny+n)等于a[m][n],原来的分配法就不行

全看树展主题 · 分页首页 上页
/ 6
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河