指针与二维数组
我想要得到二维数组元素的地址,写成下面这样是可以的。
#include <stdio.h>
int main()
{
int a[2][2] = {1, 2, 3, 4};
int *p;
for (p = a[0]; p < a[0]+4; p++) {
printf("%0x,%d\n", p, *p);
}
return 0;
}
但是,当把“ for (p = a[0]; p < a[0]+4; p++)”写成“ for (p = a; p < a+4; p++)”,就会提示“initialization from incompatible pointer type”。
p = a与p = a[0],不都是取二维数组的首地址嘛?为什么会出现这个错误呢?
[解决办法]
int *p是一维,要用二维应该定义是int **p;
[解决办法]
使用二维指针时,你需要小心,二维指针有以下几种情况:
一维连续,二维不连续;
一维不连续,二维连续;
一维不连续,二维连续;
一维连续,二维连续,最后这种是最好处理的一种。
[解决办法]
[解决办法]
- C/C++ code
//在堆中开辟一个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
[解决办法]
a[0]指向的是一个拥有两个int类型元素的数组,而p指向的是int类型的变量,两个虽然都是指针,但是指向的对象类型不同。
可以看下《C缺陷与陷阱》3.1指针与数组