二维数组如何用指针表示 c语言用二维数组名引用元素的指针表示方法:

作者&投稿:局琦 (若有异议请与网页底部的电邮联系)

二维数组用指针表示有两种方式:

一、动态数组方式。 

完全由动态数据构成二维数组。如M行N列的数组,先分配M个一维指针空间,然后在每个一维指针上分配N个元素的空间,即成为动态二维数组。

和普通数组不同,这种动态二维数组的各行之间地址并不连续。

参考代码:

#include<stdlib.h>
int **create(int m, int n)//创建m行n列的二维数组。
{
    int **r;
    int i;
    r=(int **)malloc(sizeof(int *) *m);//分配m个int*指针内存。
    for(i = 0; i < m; i ++)//遍历每行
        r[i] = (int *)malloc(sizeof(int)*n);//每行分配n个int型元素。
    return r;//返回地址值。
}

二、通过数组指针指向已有二维数组。

对于已经定义好的M行N列数组,可以使用指向N个元素的数组指针,指向该数组并访问。 

参考代码:

int a[10][5];
int (*p)[5];//每行5个元素的数组指针。
p=a;//把p指向a。


二维数组可以看成是指针的指针,b[][] = **b;
比如b[2][5];
它是一个2行5列的二维数组,也可以看成是二级指针,一级存放的是行指针,然后每个行指针里面其实又是指向了5个列元素。
*(*(b+i)+j),*(b+i)是先取行指针,然后+j偏移到所要的列,然后*取值就得到i行j列的数据了。

是这样的,
int b[2][3]={1,2,3,4,5,6};这里假设i=1;
b+1代表移到下一行,但他的类型是(*p)[3](这个你通过把b+1赋值给*p[3],再试一下赋给*p就知道了);第一个星号后代表他指向刚刚移到的那行的第一个元素地址,再+j就是横向移到j列得到b[1][j]的地址,最后一个星号是取他的值.这是我的分析. //如果你不加里面那个星号,就是(b+i)+j,他只会继续向下(行)移动,而不会往列的方向移动的.

* (* (b+i)+j) 中,
* (b+i)是这个数组的行地址,
(* (b+i)+j) 是这个数组的列地址,
整个* (* (b+i)+j)才代表b[i][j]上的内容!

* (b[i]+j) 中,
b[i]就等同于*(b+i),
同理(* (b+i) ) [j]就等同于b[i][j],

不知明白否?

二维数组实质是数组的数组

c语言二维数组用指针表示的问题~

ptr=arr;
其实你这样赋值也是可以的,是没有问题的。
因为arr是二维数组的数组名,它(arr)本身就代表这个二维数组的第0行的地址。
问题关键不是出现在这里,而是在你程序的while循环语句中
while(scanf("%f", &ptr+i)&&i!=7)
i++;
你这样写是不对的,首先ptr指向的是一个地址,所以ptr+i也是一个地址,所以这里就不能用变址运算符"&"了。第二个问题是,i 从0自加到6,这里面其实有了7个数,明显超过了arr数组的长度,这样是不对的。这个循环还有一个问题就是,这本身就是一个不正常的循环(自己想想为什么)
下面是我帮你改改的代码,希望对你会有帮助。
#include
void main()
{
double arr[2][3];
double *ptr;
int i=0;
ptr=*arr; //把数组arr第0行第0列的地址赋给ptr,其作用与ptr=arr;相同,
但不建议采用ptr=arr;这样的赋值//
printf("Plese enter 2*3 numbers:
");
for(i=0;i<6;i++)
scanf("%lf",ptr+i); //注意不要将ptr+i 写成&ptr+i 或&(ptr+i),否则出错//
for(i=0;i<6;i++)
printf("%g ",*ptr++);
printf("
");
}

二维数组名a是一个指向指针的指针。也是一个指针数组名,它含3个元素,a[0]a[1],a[2]。虽然a存储的地址是该数组首元素的地址,但它指向的并不是一个变量,而是一个指针。应为a是一个指向指针的指针,它指向的是和自己存储的地址相同的指针,即a[0],a[0]是第一行一维数组的指针,可以指向具体变量。
这下明白了吧,*(a+0)它不是变量,她是指针,a指向a[0],*(a+0)就是a[0].

C语言用指针来表示二维数组的问题
答:你说要放到另外一个数组B中,但是没看到你定义新的数组,所以我就按我自己的理解做了。include <stdio.h> define ROWS 3 define COLS 4 double copy_ptr(double *tar);//一个变量就够了 //ROWS和COLS本来就是define的,全局 int main(void){ double source[ROWS][COLS]={ {0.0,0.1,0....

C语言中二维数组行指针是什么
答:第二,看看如何用数组名作地址表示其中元素。对二维数组array ,array[0] 由 array指向,故*array 与array[0] 是相同的,依次类推可得 array[i] 由array+i 指向,*(array+i) 与array[i]是相同的。 因此,对于数组元素 array[i][j] ,用数组名表示为 *(*(array+i)+j) ,指向该元素的指...

c语言,指向一维数组的指针变量
答:p=&a;才是=号两边类型匹配。因为p被声明为指向有4个元素的一维整型数组的指针,而a被定义为一个整型数组的第一个元素的指针,所以写成p=a;等号两边类型不匹配,连编译都过不了。而&a就是一个有4个整型元素的一维数组的指针——就是说在int a[4]={1,3,5,7};的定义后,a是1的地址,a+...

C语言指向二维数组的指针
答:二、你的 float *p 定义的是:一个指向浮点数的指针。这个是一维的。在调用的过程中,float 指向的是 xx。一个浮点数字。两个的定义不同,所以参数传递过程中会出错。三、你的 float (*p)[4] 定义的是:一个指向含有四个元素的浮点数组的指针。在调用的过程中,float 指向的是{xxx,xx...

C语言如何定义指针指向字符型二维数组
答:1.使用列指针:定义一个列指针p,让它指向二维数组的第0个元素 int a[3][4];int *p;p=&a[0][0];//因为a[0]是第0行的数组名,所以p=&a[0][0]相当于p=a[0],因为a[i][j]前面共有i*4+j个元素 该二维数组的任意i行j列元素可表示为*(p+i*4+j)。2.使用行指针:定义一...

【C语言小白】求问如何用指针输入一组二维数组如a[3][4],就是在输入...
答:include<stdio.h> #include<malloc.h> #define N 4 //定义一个4列的二维数组,每一行的存储空间需要动态申请int main(){int *a[3]; //声明3行的二维数组,现在是指针数组int i,j;for(i=0;i<3;i++){a[i]=(int *)malloc(N*sizeof(int));for(j=0;j<N;j++){scanf("%d",&...

C语言、二维数组指针中的 * 和 &
答:不难理解,这代表的是第i行的首地址,也就是第i行的第一个元素的地址,如书所说,a+i,a[i],&a[i][0]的值是一样的,还有一个是*(a+i),这个就需要转转脑筋了,二维数组用指针怎么表示?用二维指针即:**a,那么a[3][4]这个数据(注意是一个数值)用指针怎么表示呢?*(*(a+3)...

c++指针数组怎么用,还有指针数组和数组指针
答:参考实例应用如下://注意指针数组和数组指针分别是如何指向二维数组的;include <stdio.h> main(){ static int m[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};/* 定义二维数组m并初始化*/ int (*p)[4];//数组指针 p是指针,指向一维数组,每个一维数组有4个int元素 int i,j;int ...

指向一维数组的指针是几级指针 ?指向一维数组元素的是几级指针?指向一...
答:指向一维数组的指针是二级指针,指向一维数组元素的指针是一级指针,指向一级指针的指针是二级指针 例如 int a[5] = {1, 2, 3, 4, 5};int **s0, *s1, **s2;s0 = &a;s1 = &a[2];s2 = &s1;s0 是二级指针,它指向一维数组 s1 是一级指针,它指向一维数组的元素 s2 是二级指...

C语言 如何定义一个二维指针数组?
答:定义二维指针数组与定义一维指针数组差不多,只是矩阵的维度增加了一维而已。下面通过具体的实例来说明如何定义一个二维数组 int *p[2][3]; // 定义一个二维数组,只是定义,并没有分配地址空间int i,j; // 数组的行数和列数// 下面的2个for循环是用来对二维指针数组进行初始化的,也即分...