大家好,今天小编关注到一个比较有意思的话题,就是关于c语言指向二维数组的指针的问题,于是小编就整理了4个相关介绍c语言指向二维数组的指针的解答,让我们一起看看吧。
二维指针数组怎么指向某一行?
p+1会使得指针指向二维数组的下一行,p-1会使得指针指向数组的上一行。
想定义一个指针,使得这个指针有这样的特性—— 指针 p指向arr[0], 指针 p+1 指向arr[1] ,指针 p+2指向arr[2], 也就是指针每移动一个单位的地址就指向下一个一维数组,那么这个指针必须满足下面二个条件:
1、必须是整型 2、必须每移动一个单位的地址时实际上移动一个一维数组的长度即3个整型量。
指向整型数组的指针如何用?
数组指针(也称行指针)
定义 int (*p)[10];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是10,也可以说是p的步长。也就是说执行p+1时,p要跨过10个整型数据的长度。
例:
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
所以数组指针也称指向一维数组的指针,亦称行指针。
指针数组
定义 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天核心突破
二维数组指针计算公式?
二维数组可以看成是指针的指针,比如b[2][5];它是一个2行5列的二维数组,也可以看成是二级指针,一级存放的是行指针,然后每个行指针里面其实又是指向了5个列元素。
*(*(b+i)+j),*(b+i)是先取行指针,然后+j偏移到所要的列,然后*取值就得到i行j列的数据了
C语言中,怎么用指针访问数组元素,要注意哪些问题?
指针是C语言中很重要的一部分内容,可以说是C语言的精髓,但是指针在初学的时候确实比较难理解,尤其是与数组混在一起之后,很容易搞混淆。下面讲解一下指针如何访问数组,及注意事项。
首先看几张图。
上图中,定义了一个int型数组,有4个元素,定义了指针变量p。p=&a[0]的意思是将首元素的地址赋值给指针变量。
p=a的意思是将首元素的地址赋值给指针变量。
*p=a的意思是将首元素的地址赋值给指针变量,在声明的时候完成了赋值。
由以上可以看出,p=&a[0],p=a,*p=a 三者的含义是一致的。
数组名a代表的就是数组地址,所以p=&a[0],p=a,二者是等价的。
声明时赋初值:
使用指针访问数组元素。
现在***设有一个整型数组定义为 int data[5] ;
现令data[0]=0;data[1]=1;data[2]=2;data[3]=4;data[4]=4;
然后涉及到了我们的问题怎么访问这5个元素
通常的做法可以用下标法,即直接用data[0]表示第一个元素,data[1]表示第二个元素等等。
如果***用指针的方法,我们要注意几个问题。首先指针是一个保存地址的变量,而数组的名即是数组的地址,*运算符则可以将某地址所存储的值的出来。
由以上三点可得, data表示第一个元素的地址,那么*data即是第一个元素的值,data+1表示第二个元素的地址,那么*(data+1)即是第二个元素的地址。完整程序如下
1 对初学者而言,你的指针类型必须和数组类型一致,必须一致、必须一致……必须一致,或许你看到有牛人用字符型指针访问长整数啥的,一定记住那是魔鬼……那是魔鬼!
2 你要记住数组名称实际也是指针,但这个指针的地址不能增减,数组名变量始终记着这个数组存储的开始地址。
但指针变量的地址可以增减,你心中必须非常清楚你的指针变量指的是数组中的第几个数,如果要用指针来回访问数组,记着访问到数组尾巴上以后,下一次一定要让指针再次指向数组头上,就是要:
p=Array;
p=&Array[0];
之类的语句初始化。
3 记住你访问的数组中到底有几个数,例如一个数组中有10个数,指针或许能访问到第11个甚至更多个数,但那些真的不是你要的;
4 访问多维数组,例如是三维,一定记住面指针、行首指针、列指针等等,一定要清楚这些东西在内存中怎么存储的。
总之,脑子没记性的人最好下标法访问数组,一定别听那些关于“指针访问数组更快”的神话,那点更快的速度不值得记忆力一般的人冒险。
到此,以上就是小编对于c语言指向二维数组的指针的问题就介绍到这了,希望介绍关于c语言指向二维数组的指针的4点解答对大家有用。