精华内容
下载资源
问答
  • 行指针和列指针的理解

    万次阅读 多人点赞 2018-06-05 16:52:38
    指针与二维数组 int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; 我们以为,二维数组存储形式是: 但是,二维数组实际上是以一维数组为单位连续存储。...也就是第一行的首地址,是指首行一整行,...

    指针与二维数组

    int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

    我们以为,二维数组的存储形式是:

    但是,二维数组实际上是以一维数组为单位连续存储的。

    这样,上述的二维数组就可以看成是“特殊的”一维数组了。

    而数组名a是这个“特殊的”一维数组的名称,也就是首地址(常量地址),也就是第一个元素的地址。

    也就是第一行的首地址,是指首行一整行,并不是指某个具体元素。

    对于这种,我们称之为“行指针”。同理:a+0,a+1,a+2,都是行指针。

     

    接下来,我们来放大观看首行,首行的元素分别是:a[0][0],a[0][1],a[0][2],a[0][3]。

    将其看作一个独立的一维数组,那么 a[0]就是这个数组的名称,也就是这个数组的首地址。

    也就是第一个元素的地址,也就是a[0]+0。a[0]和a[0]+0都是指具体的元素。

    对于这种,我们称之为“列指针”

     

    由上面的比较可以得出:

    行指针:指向某一行,不指向具体的元素。

    列指针:指向行中具体的元素。

    也就是说,列指针只要在同一行,不管它们指向行中的哪个元素,它们的行地址都是在同一行的地址,所以它们的行地址都是一样的。

    所以,&列指针--->行指针

    相反地可以推出:

              *行指针---->列指针

    对于元素a[1][2],其地址用列指针表示为a[1]+2,等价表示为*(a+1)+2,那么内容是*(*(a+1)+2)

    那么如何声明行指针呢?

    对于数组a[3][4],可以这样声明(并初始化)行指针: 

    int (*ptr)[4]=a;
    //注意行指针是一行中所有元素所共有的,所以应该等于列数

    由上面可知:

    行指针-->列指针:

    a+i --> *(a+i) 或a[i] 

    这里还要注意:

    声明和初始化列指针时,要注意“*”如:

    int *ptr=*a;//true
    int *ptr=a; //error

    下面是应用:

    #include<stdio.h>
    /**
    三个学生修四门功课,求总平均分,输出第n个学生成绩
    */ 
    void average(float *p, int n);
    void search(float (*p)[4], int n);
    int main()
    {
    	float score[3][4] = {{20,30,40,50},{25,35,45,55},{60,70,80,90}};
    	average(*score,12);  //*score为列指针 
    	search(score,2);	//score为行指针 
    	return 0;
    } 
    void average(float *p, int n)
    {
    	float *p_end,sum=0,aver;
    	p_end = p+n-1;
    	for(;p<p_end;p++)
    		sum=sum+(*p);
    	aver=sum/n;
    	printf("average=%5.2f\n",aver);
    }
    void search(float (*p)[4], int n)
    {
    	int i;
    	printf("No.%d :\n",n);
    	for(i=0;i<4;i++)
    		printf("%5.2f ",*(*(p+n)+i));
    }

     

    本文稍有借鉴:https://blog.csdn.net/haussuden/article/details/5965304

     

    以及:https://wenku.baidu.com/view/acf838ef856a561252d36fe3.html

    有不足之处,欢迎指出。

     

    展开全文
  • 行指针列指针的联系区别

    千次阅读 2018-07-12 21:21:51
    两个重要概念:行指针和列指针。行指针:指的是一整行,不指向具体元素。列指针:指的是一行中某个具体元素。可以将列指针理解为行指针的具体元素,行指针理解列指针的地址。那么两个概念之间的具体转换是:*行...

    两个重要概念:行指针和列指针。

    行指针:指的是一整行,不指向具体元素。

    列指针:指的是一行中某个具体元素。

    可以将列指针理解为行指针的具体元素,行指针理解为列指针的地址。

    那么两个概念之间的具体转换是:

    *行指针----列指针

    &列指针----行指针

    数组的 “[]” 其实就是取内容的意思

    int main()
    {
    	int a[3][3] = { 1,2,3,4,5,6,7,8,9 };
    	int *p;
    	p = a[2];
    
    	cout << a << endl;//代表行地址
    	cout << a+1<< endl;//行地址+1,地址加了4X3=12
    	cout << *a << endl;//取内容变成了列地址
    	cout << *a + 1 << endl;//列地址+1,加了一个int型内存4个字节
    	cout << **a << endl;//对列地址取内容得元素的值
    	cout << a[1] << endl;//[]取内容的意思,行地址+1后再取内容,所以是列地址
    	cout << *a[1] << endl;//对列地址取内容得a[1][0]元素的值
    	system("pause");
    	return 0;
    }

     

    展开全文
  • 行指针指向是确定元素a[0][0],a[1][2]或者其他元素,定义时候,我们让指针指向数组a首行地址即可 int *p=a[0]; 若要对数组中元素进行访问 for(i=0;i<2;i++) { for(j=0;j<3;j++) { printf("a[%d]...

    列指针

    列指针简而言之就是指向数组中的一个元素,例如:在数组a[2][3]中

    int a[2][3]={{1,2,3},{4,5,6}};
    

    行指针指向的是确定元素a[0][0],a[1][2]或者其他元素,定义的时候,我们让指针指向数组a的首行地址即可

    int *p=a[0];
    

    若要对数组中的元素进行访问

    for(i=0;i<2;i++)
    {
    	for(j=0;j<3;j++)
    	{
    		printf("a[%d][%d]:%d\n",i,j,*(p+3*i+j));
    	}
    }
    

    行指针(数组指针)

    行指针指向的是数组中每一行的地址,意味着我们如果要访问数组中的每行首地址元素,需要对我们的指针进行两次解引用操作,例如:

    int (*p)[3] = a     //首先对行指针初始化,需要注意要加括号,不然就变成指针数组
    /*先来看看首行地址*/
    printf("*p:%d\n",*p);
    /*接下来读取数组中第一行行首元素*/
    printf("**p:%d\n",**p);
    

    输出结果如下:

    在这里插入图片描述
    如果需要对数组中每个元素进行访问(行指针向列指针的转换),即先取出每行首地址后,再加上每一列相对于此行首元素的偏移量*(*(p+i)+j) 。
    *(p+i)相当于每一行的地址,来看看代码。

    for(i=0;i<2;i++)
    {
    	printf("a[%d]:%d\n",i,*(p+i));
    }
    

    结果如下:
    在这里插入图片描述
    对每一个元素进行打印:

    for(i=0;i<2;i++)
    {
    	for(j=0;j<3;j++)
    	{
    		printf("a[%d][%d]:%d\n",i,j,*(*(p+i)+j));
    	}
    }
    

    打印结果如下:
    在这里插入图片描述


    最后,特别提一下指针数组

    int *p[3];
    

    指针数组相当于一个数组,其中存放的都是指针变量,我们将a[2][3]的每一行首地址存入这个数组,再通过解引用操作得到每一行的首元素。

    for(i=0;i<2;i++)
    {
    	p[i]=a[i];
    	printf("*p[%d]:%d",i,*p[i]);
    }
    

    打印的结果:
    在这里插入图片描述
    若要访问所有元素:

    for(i=0;i<2;i++)
    {
    	p[i]=a[i];
    	for(j=0;j<3;j++)
    	{
    	printf("a[%d][%d]:%d\n",i,j,*(p[i]+j));
    	}
    }
    

    打印的结果:
    在这里插入图片描述

    展开全文
  • 指向二维数组的指针——讨厌的行指针和列指针反思学指针的时候行指针和列指针就是难点,还记得老师当时就说这几乎是C语言最难理解的地方了(当然只是基础语法,我们还没讨论复杂功能实现),下面介绍一下行指针列...

                               指向二维数组的指针——讨厌的行指针和列指针反思

    文章开始把我喜欢的这句话送个大家:这个世界上还有什么比自己写的代码运行在一亿人的电脑上更酷的事情吗,如果有那就是让这个数字再扩大十倍。

    学指针的时候行指针和列指针就是难点,还记得老师当时就说这几乎是C语言最难理解的地方了(当然只是基础语法,我们还没讨论复杂功能实现吐舌头),下面介绍一下行指针列指针方面的基础基础基础易混易混易混的地方,毕竟基础决定层建筑!适合小白,以及对指针一直有困惑的人,希望可以解决你的困惑,欢迎指正。

    定义行指针的方法:

    T array[4][5];
    T (*ptr)[5];//5为该二维数组列的个数

    ptr=array;//若位列指针则这样定义:  T *ptr=array[0];


    此时ptr+1=array+1,及移动一行。
    *(ptr+Row)+Col 为列地址,且为该数组第Row行,第Col列的地址
    *(*(ptr+Row)+Col) 为具体的值

    下面对行地址和列地址的表示方法进行总结如下:
    iArr 为二维数组名
    行地址:
    iArr   iArr+i &iArr[i]    &*(iArr+i)
    列地址
    *iArr  *(iArr+i)   iArr[i]



    通过以上总结相信大家可以发现列地址和行地址之间存在着以下关系即行地址进行一次*运算即为列地址,同样的列地址进行一次&预算即为行地址

    加油吧,程序员!

    展开全文
  • 首先,需要理解一下数组指针和指针数组这两个名词: “数组指针”和“指针数组”,只要在名词中间加上“的”这个字,就知道中心了 数组的指针:是一个指针,指向数组的指针。 指针的数组:是一个数组,装着指针的...
  • 首先上一段代码: 1 #include ...因为对于数组a,a是一个行指针,且a+1是会直接跳过一行。但是p是一个列指针,且p+1只是指向列下一个元素。 这就是上面新增两行代码会警告说从不兼容指针类型赋值根本原因
  • 如果配合http://wenku.baidu.com/view/acf838ef856a561252d36fe3.html去看话下面内容比较容易理解 从一道题目说起。   #include using namespace std; int main() { int ia[3][4]={0,1,2,3,4,5,6,7,8,...
  • int a[3][4]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12};//定义一个三行四列的矩阵 ...说明a[0]储存就是个地址,a[0]是一个行指针a[0][0]意思就是行指针a[0]第一个元素。 cout cout cout cou
  • 理解方式1:可以将数组看成行和列构成,即理解成24列。(传统的理解方法) 理解方式2:可以将multi数组看作一个包含2个元素,而其中每个元素都是一个包含4个int变量的数组。 3.图形理解方式 ...
  • 对于数组和指针,我觉得谭浩强老师这部分讲得比较详细,他书我觉得是是入门快好书。 一、 对于一个int a[ 3 ] [4 ]二维数组(INT是32位数据类型) 我们这样理解:1、a,a+1。。。都是地址。(凡是不带*...
  • 如何理解指针与引用 ...上图中每相当于每个楼层,而每一相当于处于同一楼单元所有房间。 我们在000011A0楼层第4第5个房间分别存了两个数,0x310x32。 000011A4就是第4个房间地址,房间...
  • 指向指针的指针 word

    2011-04-10 09:43:32
    10.7 指针数组指向指针的指针 10.7.1 指针数组的概念 一个数组的元素值为指针则是指针数组。 指针数组是一组有序的指针的集合。 指针数组的所有元素都必须是具有相同存储类型指向相同数据类型的指针变量。 指针...
  • 首先定义了一个二维数组a,当然我们必须把a看成一个一维数组,它有两个“大”()元素,每个“大”()元素都由五个“小”()元素,这是我们理解数组前提条件。a是一个数组,它数组名a代表了其首元素...
  • 就指向指针的指针,很早以前在说指针的时候说过,但后来发现很多人还是比较难以理解,这一次我们再次仔细说一说指向指针的指针。 先看下面的代码,注意看代码中的注解: #include  #include  using namespace...
  • 二维数组指针

    2020-01-24 20:19:20
    目录●´∀`●二维数组指针——行指针和列指针写在前面——“int[N]型”数据类型二维数组指针行指针列指针 二维数组指针——行指针和列指针 写在前面——“int[N]型”数据类型 “int[N]型”数据类型:C语言中并不...
  • C语言二维数组指针(指向二维数组的指针)详解

    千次阅读 多人点赞 2020-05-27 17:43:22
    二维数组在概念上是二维,有行和列,但在内存中所有数组元素都是连续排列,它们之间没有“缝隙”。以下面二维数组 a 为例: int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} }; 从概念上理解...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 161
精华内容 64
关键字:

行指针和列指针的理解