主题:【求助】向各位高手请教一个c语言中数组与指针的问题 -- 数值分析
可以试一下,其实 a[0][0]=*( (int *)a )。
如果是按照他在main里面定义的
int a[5][5];
这个a就是数组的首地址,而不是多级间指,那么*a = a[0][0]。他这个混乱就在于主函数是按照多维数组定义,在函数f1调用的时候却又当作多级间指来处理的。
a[0][0] = *a,不过b[0][0] != *b。楼主原文中的a和你同样定义的,当然是a[0][0] = *a了。
你这个就是多维数组和多级间指的差别。不过这种a到b的转换太费劲,对于初学者而言也有点费解。多维数组在C里面直接定义个m*n的一维数组进行处理最简单。
一维数组没问题,但多维数组就不行了。
#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 帖 引用 (帖内工具实现)
要实现多维数组一般这样:
假设要创建一个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的二维数组
其实内存分配上和您的方法是一样的。
非常有意思。
透彻,真乃真知灼见
花
这个分配法有问题,数组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],原来的分配法就不行