今天本人在写题的时候 本人突然发现了本人有点数组问题不清楚 所以本人想请大家帮本人解决一下
是这样的 在二维数组 int a[3][4] 中 *a代表的是&a[0][0] 然后之后的数组的地址都可以写成是 *(a+i)+j 的形式(i j 不越界)
本人考虑到二维数组在内存中的存储是先存第一行接着存第二行以此类推
所以呢本人今天用了一个malloc函数构造了一个 同样大小的数组 按照存放二维数组的方式存放数据 输入scanf (“%d”, *(a+i)+j)但是
却不可以 本人感到很困惑 求告诉本人的想法哪里错了。
这是本人写的程序 目的是用来检测矩阵的对角线的元素是不是1
# include <stdio.h>
# include <malloc.h>
bool matrix(int *a, int n);
int main()
{
int size;
printf(“请输入矩阵的大小:\n”);
scanf(“%d”, &size);
int *a = (int *)malloc(sizeof(int) * size*size);
if ( matrix(a, size) )
{
printf(“YSE!\n”);
}
else
{
printf(“NO\n”);
}
return 0;
}
bool matrix(int *a, int n)
{
int i, j, count, jump;
for (i=0; i<n; i++)
for (j=0; j<n; j++)
scanf(“%d”, a+i+j); //把这一行用scanf (“%d”, *(a+i)+j)替换就不行了
//本人把循环写成这个样子 就是为了相似于二维数组
jump = 0;
for (count=0; count<n; count++)
{
if (*(a+jump) != 1)
{
return false;
}
else
{
jump += n+1; //跳到下一个对角线的位置
count++; //用来控制行数
}
}
return true;
}
是这样的 在二维数组 int a[3][4] 中 *a代表的是&a[0][0] 然后之后的数组的地址都可以写成是 *(a+i)+j 的形式(i j 不越界)
本人考虑到二维数组在内存中的存储是先存第一行接着存第二行以此类推
所以呢本人今天用了一个malloc函数构造了一个 同样大小的数组 按照存放二维数组的方式存放数据 输入scanf (“%d”, *(a+i)+j)但是
却不可以 本人感到很困惑 求告诉本人的想法哪里错了。
这是本人写的程序 目的是用来检测矩阵的对角线的元素是不是1
# include <stdio.h>
# include <malloc.h>
bool matrix(int *a, int n);
int main()
{
int size;
printf(“请输入矩阵的大小:\n”);
scanf(“%d”, &size);
int *a = (int *)malloc(sizeof(int) * size*size);
if ( matrix(a, size) )
{
printf(“YSE!\n”);
}
else
{
printf(“NO\n”);
}
return 0;
}
bool matrix(int *a, int n)
{
int i, j, count, jump;
for (i=0; i<n; i++)
for (j=0; j<n; j++)
scanf(“%d”, a+i+j); //把这一行用scanf (“%d”, *(a+i)+j)替换就不行了
//本人把循环写成这个样子 就是为了相似于二维数组
jump = 0;
for (count=0; count<n; count++)
{
if (*(a+jump) != 1)
{
return false;
}
else
{
jump += n+1; //跳到下一个对角线的位置
count++; //用来控制行数
}
}
return true;
}
解决方案
5
int main(){ char _array[3][4]; char *a = (char *)_array; printf("_array:%p &_array[1][2]:%p *(_array+1)+2:%p\n", _array , &_array[1][2], *(_array+1)+2); printf("a:%p ,(a+1*4)+2:%p\n", a, (a+1*4)+2); return 0; }
题主拿这个代码去执行,本人悟一下?
注意:”*a代表的是&a[0][0]”这个说法是不对的,它们的类型不一样的……
比方说char *pc=NULL, int *pi=NULL
pc和pi都是null,但是pc+1和pi+1的结果就完全不一样了
5
原因是动态分配的数据,没有每一维 大小,相关的类型信息
所以 *(a+i)+j 没法计算
所以 *(a+i)+j 没法计算
5
int ** arr_2d(int m,int n){
int **p=(int **)malloc(sizeof(int*)*m);
int i;
p[0] = (int*)malloc(sizeof(int)*m*n);
for(i=1;i<m;i++){
p[i]=p[0]+i*n;
}
return p;
}
void free_arr_2d(int **p){
free(p[0]);
free(p);
}
也许这么做可以,你试试
int **p=(int **)malloc(sizeof(int*)*m);
int i;
p[0] = (int*)malloc(sizeof(int)*m*n);
for(i=1;i<m;i++){
p[i]=p[0]+i*n;
}
return p;
}
void free_arr_2d(int **p){
free(p[0]);
free(p);
}
也许这么做可以,你试试
5
请题主准时参加赵4老师的公开课《C语言指针与汇编内存地址(三、四)——通过静态和动态一、二、三维数组实例了解指针与数组对应的汇编内存地址。》