精华内容
下载资源
问答
  • 1.行指针与列指针区别是否是+1上的不同,例如a[0]+1是指a[0][1]的地址而&a[0]+1是指a[1][0]的地址!除了上面还有其他的行指针与列指针表示方法吗?只要有其功能就可!——本质上不存在任何区别,n维数组的存储...

    1.行指针与列指针区别是否是+1上的不同,例如a[0]+1是指a[0][1]的地址而&a[0]+1是指a[1][0]的地址!除了上面还有其他的行指针与列指针表示方法吗?只要有其功能就可!——本质上不存在任何区别,n维数组的存储空间都是连续的,只不静态声明数组时,编译器帮你生成了根据下表访问特定元素的代码,如a[3][3],使用a[1][2]则编译器帮你生成*(a+(3*1)+2)的指针访问代码,所以对于二维数组,设n,m分别为其一、二维,行指针:a+(n*行数),列指针:a+列数,在该位置的元素:a+(n*行数)+列数,不过用这种思维来理解数组欠妥,特别是维数多的时候。2.**a,*a[0]是否别代表a[0][0]这个元素,是否就代表a可以当作指针,还是有其他的区别!能讲一点也好?——不代表,a本身就是指针,而且是个值不能改变的指针,除非数组的元素是指针或多阶指针3.正如上面所说,a,a[0],&a[0][0]是指同一个地址,除了上述+1区别,还有么?(可以从用法或其他方面说)——转变思维方法,数组是线性存储,就线性地去理解它4.数组a[3][3],为何这个不可以for(i=0;i<9;i++)scanf("%d",a++);而for(i=0;i<9;i++)scanf("%d",a+i);可以呢?区别在哪?——a是个不能改变值得指针,所以a++肯定是错的

    阅读全文 >

    展开全文
  •  最近在百度知道里面发现很多学习初学者搞不清楚行指针的具体概念,今天在这里作下详细的解释分析。  行指针,顾名思义就是指向一行的指针。那么哪里会用到行指针呢,用的最多的,那就是二维指针了,大家都知道,...

       From:http://soft.chinabyte.com/database/339/12423339.shtml

      最近在百度知道里面发现很多学习初学者搞不清楚行指针的具体概念,今天在这里作下详细的解释分析。

      行指针,顾名思义就是指向一行的指针。那么哪里会用到行指针呢,用的最多的,那就是二维指针了,大家都知道,我们通常把二维指针看成一个行列式,但是它在内存中的排序却是和一维指针一样的。

      比如组a[2][3]={{1,2,3}{4,5,6}},a是整个数组的首地址,同时也指向第一行元素,即a是一个行指针,它每加1,所指地址移动二维数组的一行,a+1指向第二行元素。

      对a取*,即*a指向第一行第一个数,*(a+1)指向第二行第一个数,可见,对行指针取值就成了列指针,此时它还是个指针。它每加1,所指地址移动一个元素,*(a+1)+1指向第二行第二个元素,也可以写成a[1]+1。

      **a(也可写成a[0][0])就是这个二维数组第一行的第一个元素,**(a+1)(也可写成a[1][0])就是第二行的第一个元素,*(*(a+1)+1)(也可写成a[1][1])是第二行的第二个元素。可见,对行指针取2次*就成了某个元素的值了,而不再是地址。

      有这样一个公式a[i][j]=*(*(a+i)+j),应该就知道为什么了吧…

      行指针还可以这样定义int (*p)[n],此处定义的p指针,每加1,移动n个地址位(针对不同二维数组定义不同的n值)比如下面的这段:

      int main(void)

      {

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

      int (*p)[3];

      p = a;

      p++;

      printf("%d",**p);

      }

      此段代码输出结果为4,p是个行指针,可以直接将a这个行指针直接赋值给它,此时p也指向二维数组的起始地址,即第一行。p++就会移动3个元素,从而指向第二行。用法同二维数组名a。

    转载于:https://www.cnblogs.com/cnsealine/p/3590394.html

    展开全文
  • C语言行指针和列指针

    万次阅读 多人点赞 2013-03-11 23:20:11
    本文主要介绍C语言二维数组中的行指针及列指针,目的是为了搞清二维数组或更高维数组在作为函数参数进行传递时,考虑到代码的可复用性及软件最小权限原则,如何声明该形式参数。学习笔记,仅供参考,如有错误,敬请...

    本文主要介绍 C 语言二维数组中的行指针及列指针。学习笔记,仅供参考,如有错误,敬请指出。

     

    一.行指针

     

    在说行指针之前,先看几种指针类型(以int为例):

     

    int* a;//a是指向整形的指针;
    int* a[5];//一维指针数组(这里存放着5个指向整形的指针),a指向第一个元素的地址,a+1指向第二个......(a[5]是一个指针数组);
    int (*a)[5];//指向数组(这里每个一维数组含5个元素)的指针,a是第一个一维数组的首元素地址,a+1指向第二个一维数组的首元素地址......(a是数组指针);
    int (*a)();//a是指向函数的指针(函数指针);
    int *a();//函数的返回类型是int *,a只是一个函数名;

     

    常用的一维数组,如:

     

    int a[5];
    //a是一个指向非常量的常量指针,即a本身的值不能变如a=a+1就出错,但是a指向的地址的值可以变如*a=1123,此处a数据类型即是int * const;
    //a的值是该数组第一个元素的地址,即a=&a[0];
    //*a即第一个元素的值;

     

     

    常用的二维数组,如:

    int a[3][5];
    //此处,a也是一个指向非常量的常量指针,如果要说什么才是行指针?那么这里的a便是!

     

     

    写法 解释 指针类型
    a+0或&a[0] 指向第1个一维数组的地址(指向第1行) 行指针
    a+1或&a[1] 指向第2个一维数组的地址(指向第2行) 行指针
    a+2或&a[2] 指向第3个一维数组的地址(指向第3行) 行指针
     
    行指针是指向数组的指针,即上面几种指针类型中的 int (*a)[5];所以,当二维数组要被当做参数进行传递时,可以这样声明:
    void funcByRowPtr(int (*p)[5],const int row);
    或者
    void funcByRowPtr(int p[][5],const int row);
     

    附上测试代码:

     

    #include <stdio.h>
    
    int main()
    {
    	void funcByRowPtr(int (*rowPtr)[5],const int row);
    	void printArray(const int * const colPtr,const int row,const int col);
    	int example[3][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
    	funcByRowPtr(example,3);
    	printArray(*example,3,5);
    	
    	return 0;
    }
    void funcByRowPtr(int (*rowPtr)[5],const int row)
    {
    	int i=0,j=0;
    	for(;i<row;i++)
    	{
    		for(j=0;j<5;j++)			
    			*(*(rowPtr+i)+j)=1;//或者写成 rowPtr[i][j]=1;
    	}
    }
    
    void printArray(const int * const colPtr,const int row,const int col)
    {
    	int i=0,j=0;
    	for(i=0;i<row*col;i++)
    	{		
    		if(j!=col-1)
    		{
    			j++;
    			printf("%d,",*(colPtr+i));	
    		}
    		else
    		{
    			j=0;
    			printf("%d\n",*(colPtr+i));	
    		}		
    	}
    	printf("-------------------\n");	
    }
    
    结果:

     


     

    可以看到,上述函数:

    void (int (*p)[5],const int row)或者void (intp[][5],const int row)

    的声明方法都不具有可复用性(列数固定),为了使代码具有可复用行,可以考虑使用列指针。

     
    二.列指针
     

    对于一个二维数组:

     

    int a[3][5];

     

    前面已经知道,a即是它的行指针,a+0表示第0行的地址,a+1表示第1行地址…

    或者可以说成&a[0]表示第0行的地址,&a[1]表示第1行的地址…

    那么a[0]+0,a[0]+1…就表示第1行第1列的地址,第1行第2列地址…

    a[1]+0,a[1]+1就表示第2行第1列地址,第2行第2列地址…

     

    写法 解释 指针类型
    a[0]+0或&a[0][0] 指向第1行第1列的地址 列指针
    a[0]+1或&a[0][1] 指向第1行第2列的地址 列指针
    a[1]+0或&a[1][0] 指向第2行第1列的地址 列指针
    a[1]+1或&a[1][1] 指向第2行第2列的地址 列指针

    像上面的a[row]+col即列指针,列指针经过一次解引用就可以转化成二维数组中实际的值,列指针也是指向非常量的常量指针。

    所以如果用列指针进行函数传参,可以直接声明如下:
    void funcByColPtr(int * const colPtr,const int row,const int col);

    附上测试代码:

    #include <stdio.h>
    
    int main()
    {
    	void funcByColPtr(int * const colPtr,const int row,const int col);
    	void printArray(const int * const colPtr,const int row,const int col);
    	int example[3][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
    	funcByColPtr(*example,3,5);
    	printArray(*example,3,5);
    	
    	return 0;
    }
    void funcByColPtr(int * const colPtr,const int row,const int col)
    {
    	int i=0;
    	for(;i<row*col;i++)
    	{
    		*(colPtr+i)=2;//这里是考虑到二维数组本质上也是按顺序排列的
    	}
    }
    
    void printArray(const int * const colPtr,const int row,const int col)
    {
    	int i=0,j=0;
    	for(i=0;i<row*col;i++)
    	{		
    		if(j!=col-1)
    		{
    			j++;
    			printf("%d,",*(colPtr+i));	
    		}
    		else
    		{
    			j=0;
    			printf("%d\n",*(colPtr+i));	
    		}		
    	}
    	printf("-------------------\n");	
    }
    
    结果:


    综上所述:对行指针解引用,可以得到列指针,对列指针解引用,可以得到具体的元素值:
    但是这并不表示行指针可以作为二级指针进行函数传参!
    以下是将行指针作为二级指针的实参进行传递,导致编译错误的代码:
    int main()
    {
    	void wrongFunc(int ** rowPtr,const int row,const int col);
    	void printArray(const int * const colPtr,const int row,const int col);
    	int example[3][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
    	wrongFunc(example,3,5);
    	printArray(*example,3,5);
    	
    	return 0;
    }
    void wrongFunc(int ** rowPtr,const int row,const int col)
    {
    	int i=0,j=0;
    	for(;i<row;i++)
    	{
    		for(j=0;j<col;j++)
    		{
    			*(*(rowPtr+i)+j)=3;
    		}
    	}
    }
    
    void printArray(const int * const colPtr,const int row,const int col)
    {
    	int i=0,j=0;
    	for(i=0;i<row*col;i++)
    	{		
    		if(j!=col-1)
    		{
    			j++;
    			printf("%d,",*(colPtr+i));	
    		}
    		else
    		{
    			j=0;
    			printf("%d\n",*(colPtr+i));	
    		}		
    	}
    	printf("-------------------\n");	
    }
    
    编译时,提示:
    warning: passing arg 1 of `wrongFunc' from incompatible pointer type

    原因是函数的第一个参数类型是int **,而实际接收到的参数却是:

    int(*)[5];这是两种不同类型的指针类型!
     
     

     

     

     

    展开全文
  • C语言行指针

    2017-03-26 16:29:11
    (这里比较难以理解的是行指针行指针可以转化为元素指针,方法是在前面加一个”∗*”,指向改行的第一个元素。也就是说加上了”∗*”之后,它还是一个地址。代码#include #include #define M 2 #define N 2

    今天复习指针的时候看到书上讲二维数组中的两类指针:

    • 一类是元素指针
    • 一类是行指针

    元素指针指向一个元素,行指针指向整个行。(这里比较难以理解的是行指针)

    行指针可以转化为元素指针,方法是在前面加一个””,指向改行的第一个元素。也就是说加上了””之后,它还是一个地址。

    代码

    #include <stdio.h>
    #include <string.h>
    #define M 2
    #define N 2
    int main(int argc, char const *argv[])
    {
        int a[M][N] = {{1, 2}, {3, 4}};
        int b[M] = {1, 2};
        int (*p)[N];
        p = a;
        int *q[N];
        // q = a;
        printf("%d\n", *a);
        return 0;
    }

    其中a在操作之后仍然是一个指针,包含的信息是地址。

    展开全文
  • //[color=#0000FF]p是一个行指针,p+1当然也是行指针,那么*(p+1)则是一个列指针[/color] for(i=0;i<4;i++) { if(*(*p+i)<60)//*p+i表示第0行第i列指针,*(*p+i)表示第0行第0列的元素 { pt=*p;//...
  • C语言笔记 指针 数组

    2017-12-21 19:39:03
    C语言指针做函数参数传递二维数组有两种基本方法: 1、传递“数组指针” #include void output( int (*pa)[3], int n )//这个函数只能输出n3列的二维数组 { int i,j; for( i=0;i;i++ ){ for( j=0;j;j++...
  • c语言数组指针

    2020-11-29 21:24:00
    可以假设: * 为升级,&为降级。 变量进化路线为: 地址-列地址-值 ...同样研究a,a是0地址,则 星a 是00列的列地址,星星a是00列的值 ps: a的降级&a还是a,a[1][1]的升级*a[1]
  • C语言对二维数组采用的这种特殊的定义方式,使得二维数组可以被看作一种特殊的一维数组:它的元素又是一个一维数组。例如: 上图中的a可以看出是一个一维数组,他有3个元素: a[0],a[1],a[2]. 每个元素又包含四个一...
  • 数组指针 (行指针) 本质是指针 只不过是指向一个数组的指针,也称之为“行指针” int (*p)[n] p是一个指针,指向一个int类型的一位数组,这个一位数组的长度是n。也就是说执行p+1时,p要跨过n个int类型数...
  • 数组指针(也称行指针)int (*p)[n];()优先及高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。int a[3][2]int (*p)[2]p ...
  • C语言简明指针教程(3)指针和数组(指针的算术运算)指针和一维数组指针和二维数组二维数组的行指针和列指针指针数组长度可变的一维动态数组长度可变的二维动态数组 指针是 C/C++的精华,如果未能很好地掌握指针,...
  • 数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二...
  • 组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋...
  • 数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将...
  • C语言void指针

    2012-05-29 09:50:40
    1.概述  本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。  2.void的含义  void的字面意思是“无类型”,void *则为“无类型指针”,void *可以... 这语句编译时会出错...
  • C语言指针05

    2019-08-04 12:32:25
    版权声明:本文为博主原创文章,未经...题目:通过输入指定行行数和列数打印出二维数组对应任一一列元素的值 #include <stdio.h> void main(){ int a[3][4]={10,13,22,31,54,52,66,27,18,89,15,89}; in...
  • C语言 指针

    2013-12-23 21:58:48
    C语言 指针用法输入12个数,然后按每4个数输出
  • c语言——指针数组_选择排序 所谓选择排序,就是每次找到未排序中最小的(最大的也)元素的位置,找到后与该位置与未排序序列的第一个元素交换值,直到该序列成为有序序列。初始状态整个序列为无序序列,每次交换...
  • c语言指针介绍

    2015-10-25 23:00:17
    01-指针介绍 要研究指针首先我们要... int类型占用4个字节,等于占了4个空间(有4个地址),不需要记住4个地址,而记住首地址就了(因为首地址相当于入口或者生活中的门)      指针到底是什么了?  
  • C语言 数组指针初始化

    千次阅读 2020-06-20 10:41:03
    当然不行,不管从初始化器,还是从原理上来讲都不正确,首先a[3][4]表示的是数组中第4第5个元素,请问,可以对数组中具体的一个元素赋这么长一串值吗?所以不能这样赋值。第一种写法是属于初始化,初始化会自动...
  • C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用 传值 把实参的值赋值给参 那么对参的修改,不会影响实参的值 传地址 传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址...
  • 函数 函数一般遵循的格式:函数的返回类型、函数名、参数列表; void func(void) --&gt; 对应的指针 void (*P)(void) typedef定义函数指针 ...typedef int (*funptr)(int,int) // typedef ...原型:创建了...
  • C语言——指针与函数

    2019-07-16 10:32:26
    为了进一步熟悉与指针有关的编程,这里给出一个指针综合的例子 : 编写一个函数,统计mn列二维实型数组中整数,负数,零的个数 方法一:使用指向实型数组中正数,负数,零的个数 1 #include <stdio.h&...
  • 这里记录的是我在学习《C语言指针》这本书的过程中,按照从前到后的顺序记录下来的重要内容。EOF、NULL、0、\0、\n的区别EOF是end of file的缩写,是流或者文件的结束符。它是stdlib中定义的一个常量,为-1。#...
  • 近来,又有同学问我 ,关于指针的知识,回顾两年的编程之路,不知不觉,我离c语言的道路方向也偏差了很多,其实我好久都没有碰过c语言了。但是这次回顾,我又对指针有了新的认识。 首先 ,指针他到底是个什么东西呢...
  • `C语言之指针(上) -----Day14`一.知识点整理1.... 指针与数组2.1 定义和关系2.2 引用数组元素2.3 指针作为形参传入函数2.4 二维数组与指针2.4.1 行指针与列指针2.5 字符串与指针二. 难点易错点整理...
  • C语言指针转置矩阵

    千次阅读 2020-04-12 16:54:51
    转置矩阵,将原矩阵的变为列,列变为。注意,通过指针访问二维数组时的方法。本题采用的是指向数组元素的指针变量。 输入样例: 1 2 3 4 5 6 7 8 9 输出样例: 1 4 7 2 5 8 3 6 9 代码如下 #include<stdio.h&...
  • C语言指针

    2018-04-20 11:39:05
    指针 1. 指针 1.1 指针定义 1.2 指针赋值 1.3 指针运算符 2. 数组指针 2.1 一维数组指针 2.2 多维数组指针 ...3. 指针型函数 4. 指向指针指针 ...C语言最令人头疼的就是指针,总是看到别人的程序指针用的...
  • 函数指针大家了解一下就了,用得不多,但一定要认识它。 什么是函数指针 如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数...
  • C语言双重指针初始化

    2017-05-25 12:00:00
    /* 双重指针初始化 */ #include <stdio.h> #include <stdlib.h> #include <malloc.h> int main() { int m = 5;/*5*/ int n = 6;/*6列*/ /* ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,900
精华内容 760
关键字:

c语言行指针

c语言 订阅