指针与多维数组
不是有如此说法,
若有以下语句:
int a[3][5],*p;
P=&a[0][0];
则以下都是二维数组元素a[i][j]的表示方法:
*(a[i]+j);
*(*(a+i)+j);
*(a+i)[j];
*(a+4*i+j);
*(*(p+i)+j);
*(p[i]+j);
*(p+i)[j];
p[i][j];
为什么我的程序不对
#include <stdio.h>
void main ( )
{
int *p;int a[3][3]={1,2,3,4,5,6,7,8,9};
p=&a[0][0];
int b[3][3];
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
{
b[j][i]=*(*(p+i)+j);
printf("%d",p++);
}
}
或者
#include <stdio.h>
void main ( )
{
int *p;int a[3][3]={1,2,3,4,5,6,7,8,9};
p=a;//error C2440: '=' : cannot convert from 'int [3][3]' to 'int *'
int b[3][3];
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
{
b[j][i]=*(*(p+i)+j);//error C2100: illegal indirection
printf("%d",p++);
}
}
[解决办法]
首先楼主你定义的是一维指针int*而不是二维指针int**
我想你记错了你转述的这个说法
然后从for(int i = 0;这行来看,我猜你使用的可能是C++编译器
C++在类型转换上比C严格许多,所以int ** p = a;也是不一定行得通的
再然后a[b]和*(a+b)完全等价,a[3]和3[a]完全等价,这是语言标准规定的
所以a[2][3]==*(a[2]+3)==*(*(a+2)+3)==(*(a+2))[3]
[解决办法]
p=a改为p=(int *)a就可以了。指针指向数组首地址没什么问题。
*(*(p+i)+j)是有问题的,指针前加*是获取指针所指内存的内容。因此如果p=(int *)a,那么*(p + i*3 +j)就表示a[i][j]的内容。所以代码该位如下就能得到把数组a复制到数组b的结果。
#include <stdio.h>
void main ( )
{
int *p;int a[3][3]={1,2,3,4,5,6,7,8,9};
p=(int *)a;
int b[3][3];
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
{
b[i][j]=*(p + i * 3 + j);
printf("%d\n",b[i][j]);
}
}
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
p=(int **)malloc(4*sizeof(int *));
if (NULL==p) return;
for (i=0;i<4;i++) {
p[i]=(int *)malloc(5*sizeof(int));
if (NULL==p[i]) return;
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
p[i][j]=i*5+j;
}
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
printf(" %2d",p[i][j]);
}
printf("\n");
}
for (i=0;i<4;i++) {
free(p[i]);
}
free(p);
}
// 0 1 2 3 4
// 5 6 7 8 9
// 10 11 12 13 14
// 15 16 17 18 19
//在堆中开辟一个3×4×5的3维int数组
#include <stdio.h>
#include <malloc.h>
int ***p;
int i,j,k;
void main() {
p=(int ***)malloc(3*sizeof(int **));
if (NULL==p) return;
for (i=0;i<3;i++) {
p[i]=(int **)malloc(4*sizeof(int *));
if (NULL==p[i]) return;
for (j=0;j<4;j++) {
p[i][j]=(int *)malloc(5*sizeof(int));
if (NULL==p[i][j]) return;
}
}
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
for (k=0;k<5;k++) {
p[i][j][k]=i*20+j*5+k;
}
}
}
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
for (k=0;k<5;k++) {
printf(" %2d",p[i][j][k]);
}
printf("\n");
}
printf("---------------\n");
}
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
free(p[i][j]);
}
free(p[i]);
}
free(p);
}
// 0 1 2 3 4
// 5 6 7 8 9
// 10 11 12 13 14
// 15 16 17 18 19
//---------------
// 20 21 22 23 24
// 25 26 27 28 29
// 30 31 32 33 34
// 35 36 37 38 39
//---------------
// 40 41 42 43 44
// 45 46 47 48 49
// 50 51 52 53 54
// 55 56 57 58 59
//---------------
//在堆中开辟一个2×3×4×5的4维int数组
#include <stdio.h>
#include <malloc.h>
int ****p;
int h,i,j,k;
void main() {
p=(int ****)malloc(2*sizeof(int ***));
if (NULL==p) return;
for (h=0;h<2;h++) {
p[h]=(int ***)malloc(3*sizeof(int **));
if (NULL==p[h]) return;
for (i=0;i<3;i++) {
p[h][i]=(int **)malloc(4*sizeof(int *));
if (NULL==p[h][i]) return;
for (j=0;j<4;j++) {
p[h][i][j]=(int *)malloc(5*sizeof(int));
if (NULL==p[h][i][j]) return;
}
}
}
for (h=0;h<2;h++) {
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
for (k=0;k<5;k++) {
p[h][i][j][k]=h*60+i*20+j*5+k;
}
}
}
}
for (h=0;h<2;h++) {
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
for (k=0;k<5;k++) {
printf(" %3d",p[h][i][j][k]);
}
printf("\n");
}
printf("--------------------\n");
}
printf("=======================\n");
}
for (h=0;h<2;h++) {
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
free(p[h][i][j]);
}
free(p[h][i]);
}
free(p[h]);
}
free(p);
}
// 0 1 2 3 4
// 5 6 7 8 9
// 10 11 12 13 14
// 15 16 17 18 19
//--------------------
// 20 21 22 23 24
// 25 26 27 28 29
// 30 31 32 33 34
// 35 36 37 38 39
//--------------------
// 40 41 42 43 44
// 45 46 47 48 49
// 50 51 52 53 54
// 55 56 57 58 59
//--------------------
//=======================
// 60 61 62 63 64
// 65 66 67 68 69
// 70 71 72 73 74
// 75 76 77 78 79
//--------------------
// 80 81 82 83 84
// 85 86 87 88 89
// 90 91 92 93 94
// 95 96 97 98 99
//--------------------
// 100 101 102 103 104
// 105 106 107 108 109
// 110 111 112 113 114
// 115 116 117 118 119
//--------------------
//=======================
//