指针与二维数组
我想要得到二维数组元素的地址,写成下面这样是可以的。
#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;
------解决方案-------------------- 使用二维指针时,你需要小心,二维指针有以下几种情况:
一维连续,二维不连续;
一维不连续,二维连续;
一维不连续,二维连续;
一维连续,二维连续,最后这种是最好处理的一种。
------解决方案--------------------
探讨 我想要得到二维数组元素的地址,写成下面这样是可以的。 #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, ……
------解决方案-------------------- 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指针与数组