int **x是怎样声明的二维数组,具体解释一下

如题所述

int **x; 表示定义一个二维指针。

如果想动态分配二维数组,需要先分配行指针数组,再对每行进行数组分配,参考代码如下:

#include <stdio.h>
#include <stdlib.h> //malloc need
void main()
{
    int **x;
    int i,j;
    x=(int **)malloc(sizeof(int*) * 10 ); //分配10指向10个int*元素的指针(行指针)
    for( i=0;i<10;i++ ) //为每行分配数组
        x[i]=(int *)malloc(20*sizeof(int) ); //每行分配一个指向20个int元素的指针
    //接下来就可以象使用二维数组一样,使用x了,如:
    x[0][1]=100;
    x[1][1]=99;
    //用完后,释放指针,与申请时的顺序相反
    for( i=0;i<10;i++ )
        free(x[i]) ; //先释放一级指针
    free(x); //再释放二级指针
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-10-07

int **就是在内存中开辟4个字节的连续空间,但至于你怎样用,编译器是不管的,所以可能当你用x[0][0]的时候,程序就有可能报错。

(在32位DEV C++中已测试过)

int ** x还有另一个意思 

例如:

#include<cstdio>
int main(void)
{
    int  a = 10;
    int * b = &a;
    int ** c = &b;
    printf("%d\n", **c);
    **c = 20;
    printf("%d", **c);
    return 0;
}

10

20

#include<cstdio>
int main(void)
{
    int  a = 10;
    int * b = &a;
    int ** c = &b;
    int e = 50;
    int * d = &e;
    c = &d;
    printf("%d", **c);
    return 0;
}

50

(以上程序均在DEV C++测试过,其他编译器请自测)

如有不对,请指出。

第2个回答  推荐于2017-11-24
//看了楼上的回答,你是想用二级指针操作操作二维数组吧,那必须得借用一个中间环节,需要定义一个指针数组进行过渡,不能直接用二级指针指向二维数组

#include <stdio.h>

void main(void)
{
int i, j;
int **x = NULL;
int *p[4] = {NULL};//定义一个指针数组
int array[4][4] = { 0 };

for (i=0; i<4; i++)
{
p[i] = array[i];//让每一个指针指向二维数组的每一行
}

x = p;//让二级指针指向p

for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
printf("%3d", x[i][j]);
}
printf("\n");
}
}追问

声明一维数组int *str;其中str是地址。
与二维相比int **str;str是指什么,*str是指行的首地址吗?

追答

int *str = NULL; *str是指针变量,str是地址

int **str = NULL;
str是*str的地址,*str是**str的地址,所以二级指针又叫“指向指针的指针”

*str是保存第一行的首地址
*(str + 1)是保存第二行的首地址
... ...
*(str + n)是指向第三行的首地址

你可以把调用函数改成printf("%3d", *(*(x+i)+j));

本回答被提问者采纳
第3个回答  2011-09-14
int **x;
x是一个可以指向二维数组的指针
让x指向一段内存后可以像 int a[常量][常量];里的a一样使用
相似回答