c语言 指针 二维数组,c语言 指针 二维数组怎么表示

kodinid 4 0

大家好,今天小编关注到一个比较意思的话题,就是关于c语言 指针 二维数组问题,于是小编就整理了4个相关介绍c语言 指针 二维数组的解答,让一起看看吧。

  1. C语言中的二维数组名是一个二重指针吗?
  2. 指向整型数组的指针如何用?
  3. c语言中,行指针指向哪里,为什么(*p)[]方框里是二维数组的列不是行,他不是行指针吗?
  4. C语言如何动态分配二维数组?

C语言中的二维数组名是一个二重指针吗?

1、二维数组名不是二级指针,它只是一个比较特殊的常量指针。包括三维,四维,乃至N维数组也是如此。只要是数组,那么它就是一个普通的常量指针。2、二级指针p也可以解释为指针的指针,即p内保存的值实际上还是一个指针,计算:*p的值实际上是一个指针值,那么 *(*p)即二级指针指向的最终值。对于二维数组a[2][2],a也是一个地址,并且这个值也等于a[0],也等于a[0[0]的地址,即&a[0][0],由此看来对a取地址的值是一个变量值(不是指针),所以a并不是一个二级指针,最多算一个一级指针。

指向整型数组的指针如何用?

数组指针(也称行指针)

c语言 指针 二维数组,c语言 指针 二维数组怎么表示-第1张图片-安济编程网
图片来源网络,侵删)

定义 (*p)[10];

()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是10,也可以说是p的步长。也就是说执行p+1时,p要跨过10个整型数据的长度。

例:
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
所以数组指针也称指向一维数组的指针,亦称行指针。

c语言 指针 二维数组,c语言 指针 二维数组怎么表示-第2张图片-安济编程网
(图片来源网络,侵删)

指针数组


定义 int *p[n];
[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组:
int *p[3];
int a[3][4];
p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
for(i=0;i<3;i++)
p[i]=a[i]
这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
所以要分别赋值。

这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。

C语言30天核心突破

c语言 指针 二维数组,c语言 指针 二维数组怎么表示-第3张图片-安济编程网
(图片来源网络,侵删)

c语言中,行指针指向哪里,为什么(*p)[]方框里是二维数组的列不是行,他不是行指针吗?

(*p)[X]只是说p是指向一个具有X列的一维数组的指针,指针的类型(就是这个一维数组的元素的类型)有待你声明,X的大小也要你写明确,否则p就不可用;p确实是行指针,是指向一行一维数组的,但一个一维数组的长度不是用列数来表示的吗?至于p指向了哪一行,那要由代码给它赋值了才能知道。

比如有int a[3][4],(*p)[4],p=a;,那么这时p就指向了第一行(第一下标为0的那一行),p+1就指向了第二行(第一下标为1),p+2就指向了第三行(第一下标为2)。若没有赋值(没有写p=a),那么p就只是一个能指向列数为4的(即数组长度为4)int型数组的指针,它这时还是野指针,没有具体指向!

C语言如何动态分配二维数组?

使用malloc函数,先分配第一维的大小,然后循环分配每一维的大小。示例代码,分配3行4列二维数组:

#include <stdio.h>#include <malloc.h>int main(){ int **a; int i, j; a = (int**)malloc(sizeof(int*)*3)

;//为二维数组分配3行 for (i = 0; i < 3; ++i){//为每列分配4个大小空间 a[i] = (int*

)malloc(sizeof(int)*4); } //初始化 for (i = 0; i < 3; ++i){ for (j = 0; j < 4; ++j){ a[i][j] = i+j; } } //输出测试 for (i = 0; i < 3; ++i){ for (j = 0; j < 4; ++j){ printf ("%d ", a[i][j]); } printf ("\n"); } //释放动态开辟的空间 for (i = 0; i < 3; ++i){ free(a[i]); } free(a); return 0;}/*输出:0 1 2 31 2 3 42 3 4 5*/

到此,以上就是小编对于c语言 指针 二维数组的问题就介绍到这了,希望介绍关于c语言 指针 二维数组的4点解答对大家有用。

标签: 数组 指针 二维