C语言 如何定义一个二维指针数组? 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
", *p[0][1]);  // 输出结果


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

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

int array[2][2]={{1,2},{3,4}};
int* p[2][2];//here...
int (*p)[2][2];

char **p在c语言中 是定义一个二维的指针数组的意思吗?~

**p是二级指针的意思,也就是指针的指针。
当然可以用char
**p;去定义一个二维char数组。
只不过要用到malloc动态申请内存来放二维字符数组。
格式如下:
#include
"stdio.h"
main()
{
char
**p;
int
i,j;
int
row,rank;
//输入二维数组的行数和列数
printf("Please
input
row
and
rank:
");
scanf("%d%d",&row,&rank);
//以下为动态申请二维数组
p=(int
**)malloc(row*sizeof(char));
for(i=0;i<row;i++)
p[i]=(int
*)malloc(rank*sizeof(char));
//输入二维字符数组字符
printf("Please
input
data:
");
for(i=0;i<row;i++)
for(j=0;j<rank;j++)
scanf("
%c",&p[i][j]);//注意%c前有空格键,切不可丢失!
//打印二维字符数组字符
for(i=0;i<row;i++)
{
for(j=0;j<rank;j++)
printf("%c
",p[i][j]);
printf("
");
}
}
虽然我也是菜鸟,但比我还菜的问题,我是能回答出来的!
QQ121590680,虽然我加过几个C群,但里面鱼龙混杂,没几个对C有兴趣的!
高手就不敢谈了。
如果对你有所帮助,请记得采纳最佳答案,谢谢!

指针的指针和二维数组完全俩东西,二维数组是 一维数组的一维数组,元素是数组,所以可以隐式转化为int (*)[3],跟int **两回事,扩展到更多维或其它类型也是成立的,只能隐式转化为第一维的元素的指针

补充说明下隐式转化为指针,简单说就是这样(T是任意类型)
设有一个数组T a[10];
a的类型是“T [10]”,在做大多数运算的时候,都先隐式转化为“T *”类型,即T的指针
对于多维数组,可以看做是一个一维数组,数组的元素类型就是第二维开始的数组类型,比如:
T a[10][20][30];
是一个有10个类型为“T [20][30]”元素的数组,用代码解释更清晰:
typedef T U[20][30];
U a[10];
跟上面的定义等价,所以a只能隐式转化为“U *”,“U *”展开后也就是“T (*)[20][30]”这个类型了,跟多级指针没关系,因此,多维数组不存在到多级指针的转化规则,强转只会导致问题