C语言 如何定义一个二维指针数组?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 如何定义一个二维指针数组?相关的知识,希望对你有一定的参考价值。

定义二维指针数组与定义一维指针数组差不多,只是矩阵的维度增加了一维而已。


下面通过具体的实例来说明如何定义一个二维数组

int *p[2][3];  // 定义一个二维数组,只是定义,并没有分配地址空间
int i,j;  // 数组的行数和列数
// 下面的2个for循环是用来对二维指针数组进行初始化的,也即分配地址。如果不进行初始化操作,就会使指针变为野指针(即指向不明)。
for(i=0; i<2; i++)
    for(j=0; j<3; j++)
        p[i][j] = (int *)malloc(sizeof(int));
*p[0][1] = 2; // 对指针数组中指针所指向的内存单元进行赋值操作
printf("%d\\n", *p[0][1]);  // 输出结果

参考技术A 有两种方式(假设数组是a[3][4]):
一。一个一个的取元素
int a[3][4];
int *p;
p=a[0];
则将指针指向了数组a的第一个元素
二。一行一行的取元素
int a[3][4];
int (*p)[4];
p=a;
则创建了一个指向包含4个元素的指针,它可以一次指向数组的一行追问

一维的我大概懂的
就是二维的不太明白....

参考技术B 有人说指针就是数组,其实这个是可以正确理解的。一个二维数组的数组名就代表一个二级指针,可以用指针来操作二维数组,这是到处都找的到的可以这样:
int **p=NULL;
int a[i][j];
p=a;
a[i][j]=*(*(p+i)+j);
动态定义一个二维数组:
需要用两次循环,free的时候也是得用循环;追问

那如何分配呢?

参考技术C int array[2][2]=1,2,3,4;
int* p[2][2];//here...
int (*p)[2][2];追问

那怎么给二维指针数组分配空间呢?(用malloc)
还有该如何把这些地址传向自定义函数呢?
希望用能用个例子帮我解释下....谢谢啊

追答

int main(void)

int **p;
p=(int**)calloc(8,sizeof(int)*8);
if(p==NULL)printf("fail");
else printf("succeed");
free(p);
return 0;


Apply for a memory of 8*8 int...

追问

可以用malloc非配分配吗?必须calloc?
p=(int**)calloc(8,sizeof(int)*8);应该是 p=(int**)calloc(8,sizeof(int*)*8);吧?

我只知道用calloc是分配一块连续的内存空间,
malloc是随机的分配空间。
可以帮再详细的解释下吗......谢谢了....给你加分...哈哈

追答

OK,I got a example for you.There're two methods of creating a 8*8 int memory with malloc or calloc,try and see what happend...

‘BY Coo_boi
#include
#include

int** pMalloc(int**);
int** pCalloc(int**);
void pFree(int**);

int main(void)

int** p=NULL;
int i;
int k;
printf("1.malloc\n2.calloc:");
if(scanf("%d",&k)==1)

if(k==1)p=pMalloc(p);
else if(k==2)p=pCalloc(p);
else return 0;
for(i=0;i<8;i++)printf("%d",p[0][i]);
pFree(p);

return 0;


int** pMalloc(int** p)

int i;
p=malloc(sizeof(int)*8);
for(i=0;i<8;i++)p[i]=malloc(sizeof(int)*8);
for(i=0;i<8;i++)p[0][i]=i;
return p;


int** pCalloc(int** p)

int i;
p=calloc(8,sizeof(int));
for(i=0;i<8;i++)p[i]=calloc(8,sizeof(int));
for(i=0;i<8;i++)p[0][i]=7-i;
return p;


void pFree(int** p)

int i;
for(i=0;i<8;i++)free(p[i]);
free(p);

本回答被提问者采纳

C语言二维数组指针变量是啥,int (*p)[2]啥意思

二维数组指针变量形式如下:
类型名
(*数组名)[数组行数][数组列数]
如:int
(*p)[2][3];
//
定义一个int类型的二维数组指针变量,数组中每个元素都是一个指针
int
(*p)[2]表示定义一个数组指针,只是是一个一维的数组指针,数组中每个元素(共2个元素)都是一个int类型的指针变量,指针指向的地址就需要后续程序给出,不然会变为野指针。
参考技术A int
*p[2]:
指针数组,首先它是一个数组,数组的元素都是指针(int
*),数组占多少个字节由数组本身决定.它是"存储指针的数组"的简称;
int
(*p)[2]:
数组指针.首先它是一个指针,指向一个数组,在32为系统下永远占4个字节,它是"指向数组的指针"的简称;
参考技术B 二维数组指针变量:
指向一个二维数组的的指针。
int
(*p)[2]:一个含有两个
指向int
型数据
的指针元素的i数组.
参考技术C 指针形成的数组,int
(*p)[2]指两个指针变量构成的数组,这两个指针值得地址指向整形数据

以上是关于C语言 如何定义一个二维指针数组?的主要内容,如果未能解决你的问题,请参考以下文章

c语言中如何通过二级指针来操作二维数组

C语言指向二维数组的指针

C语言中二维数组行指针是啥

C语言中关于二维数据指针的问题?

C语言二维数组问题

C语言中怎样区分一维指针和二维指针?