精华内容
下载资源
问答
  • 维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,...C语言中的二维数组是按行排列的,也就是先存放 a[0] 行,再存放 a[1] 行,最后存放 a[2] 行;每行中的 4 个元素也是依次存放。数组 a
  • 指针与一维数组: #include  void test1() {  //利用指针来修改数组元素  int a[2];  int *p;  p = &a[0]; // p = a; 等效  *p = 10;  printf("%d\n",a[0]); } void test2() {  /...

    指针与一维数组:

    #include <stdio.h>

    void test1()

    {

        //利用指针来修改数组元素

        int a[2];

        int *p;

        p = &a[0]; //    p = a; 等效

        *p = 10;

        printf("%d\n",a[0]);

    }

    void test2()

    {

        //遍历数组元素

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

        for (int i=0; i<3; i++)

        {

            printf("a[%d]的值为%d\n",i,a[i]);

        }

    }

    void test3()

    {

        //利用数组来遍历数组元素

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

        int *p;

        p = a;

        

        for (int i=0; i<3; i++)

        {

            //注意:我们这里的p+1是加的对应数据类型的一个单元

            //遍历完,p的值没有改变

            printf("a[%d]的值为%d\n",i,*(p+i));

        }

    }

    void test4()

    {

        //利用数组来遍历数组元素

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

        int *p = a;

        for (int i=0; i<3; i++)

        {

            //注意:我们这里的p+1是加的对应数据类型的一个单元

            //遍历完,p的值改变了,指向了a[2] p=p+1

            printf("a[%d]的值为%d\n",i,*(p++));

        }

    }

    void test5()

    {

        //利用数组来遍历数组元素

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

        int *p;

        p = a;

        for (int i=0; i<3; i++)

        {

            //注意:我们这里的p+1是加的对应数据类型的一个单元

            //a为数组的首地址,用a+i也行, 但是a++不行,因为a是常量,数组的首地址是不能修改的

            printf("a[%d]的值为%d\n",i,*(a+i));

        }

    }

    void test6()

    {

        //利用数组来遍历数组元素

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

        int *p = a;

         for (int i=0; i<3; i++,p++)

        {

            //注意:我们这里的p+1是加的对应数据类型的一个单元

            printf("a[%d]的值为%d\n",i,*p);

        }

    } 

    void test7()

    {

        //利用数组来遍历数组元素

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

        int *p = a;

        for (int i=0; p<a+3; i++,p++)

        {

            //注意:我们这里的p+1是加的对应数据类型的一个单元

            printf("a[%d]的值为%d\n",i,*p);

        }

    }


    int main(int argc, const char * argv[])

    {  

      test1();

    test2();

    test3();

    test4();

    test5();

    test6();

    test7();

        return 0;

    }

    展开全文
  • (1)一维数组在内存中是连续分布的多个内存单元组成的,而二维数组在内存中也是连续分布的多个内存单元组成的。 (1)从内存角度来看,一维数组和二维数组没有本质差别。 (2)二维数组int a[2][5]和一维数组int b[10]...

    1.二维数组

    1.1、二维数组的内存映像
    (1)一维数组在内存中是连续分布的多个内存单元组成的,而二维数组在内存中也是连续分布的多个内存单元组成的。
    (1)从内存角度来看,一维数组和二维数组没有本质差别。
    (2)二维数组int a[2][5]和一维数组int b[10]其实没有任何本质差别。我们可以把两者的同一单元的对应关系写下来。

    a[0][0]	 a[0][1]   a[0][4]	 a[1][0]	a[1][1]	  a[1][4]	
    b[0]	 b[1]	   b[4]	     b[5]	    b[6]	  b[9]
    

    (3)既然二维数组都可以用一维数组来表示,那二维数组存在的意义和价值在哪里?明确告诉大家:二维数组a和一维数组b在内存使用效率、访问效率上是完全一样的(或者说差异是忽略不计的)。在某种情况下用二维数组而不用一维数组,原因在于二维数组好理解、代码好写、利于组织。
    (4)总结:我们使用二维数组(C语言提供二维数组),并不是必须,而是一种简化编程的方式。想一下,一维数组的出现其实也不是必然的,也是为了简化编程。

    1.2、哪个是第一维哪个是第二维?
    (1)二维数组int a[2][5]中,2是第一维,5是第二维。
    (2)结合内存映像来理解二维数组的第一维和第二维的意义。首先第一维是最外面一层的数组,所以int a[2][5]这个数组有2个元素;其中每一个元素又是一个含有5个元素的一维数组(这个数组就是第二维)。
    (3)总结:二维数组的第一维是最外部的那一层,第一维本身是个数组,这个数组中存储的元素也是个一维数组;二维数组的第二维是里面的那一层,第二维本身是个一维数组,数组中存的元素是普通元素,第二维这个一维数组本身作为元素存储在第一维的二维数组中。

    1.3、二维数组的下标式访问和指针式访问
    (1)一维数组的两种访问方式。

    以int b[10]为例, int *p = b;。
    b[0] 等同于 *(p+0);   b[9] 等同于 *(p+9);  b[i] 等同于 *(p+i)
    

    (2)二维数组的两种访问方式:

    以int a[2][5]为例,(合适类型的)p = a;
    a[0][0]等同于*(*(p+0)+0); 	a[i][j]等同于 *(*(p+i)+j)
    

    1.4、二维数组的应用和更多维数组
    (1)最简单情况,有10个学生成绩要统计;如果这10个学生没有差别的一组,就用b[10];如果这10个学生天然就分为2组,每组5个,就适合用int a[2][5]来管理。
    (2)最常用情况:一维数组用来表示直线,二维数组用来描述平面。数学上,用平面直角坐标系来比拟二维数组就很好理解了。
    (3)三维数组和三维坐标系来比拟理解。三维数组其实就是立体空间。
    (4)四维数组也是可以存在的,但是数学上有意义,现在空间中没有对应(因为人类生存的宇宙是三维的)。
    总结:一般常用最多就到二维数组,三维数组除了做一些特殊与数学运算有关的之外基本用不到。(四轴飞行器中运算飞行器角度、姿态时就要用到三维数组)

    2.二维数组的运算和指针

    2.1、指针指向二维数组的数组名
    (1)二维数组的数组名表示二维数组的第一维数组中首元素(也就是第二维的数组)的首地址
    (2)二维数组的数组名a等同于&a[0],这个和一维数组的符号含义是相符的。
    (3)用数组指针来指向二维数组的数组名是类型匹配的。

    2.2、指针指向二维数组的第一维
    (1)用int *p来指向二维数组的第一维a[i]

    2.3、指针指向二维数组的第二维
    (1)二维数组的第二维元素其实就是普通变量了(a[1][1]其实就是int类型的7),已经不能用指针类型和它相互赋值了。
    (2)除非int *p = &a[i][j];,类似于指针指向二维数组的第一维。

    总结:二维数组和指针的纠葛,关键就是2点:
    1、数组中各个符号的含义。
    2、数组的指针式访问,尤其是二维数组的指针式访问。

    #include <stdio.h>
    
    int main(void)
    {
    	int a[2][5] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}};
    	//int a[2][5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    	
    	printf("a[1][3] = %d.\n", a[1][3]);
    	printf("a[1][3] = %d.\n", *(*(a+1)+3));
    	
    	//int *p1 = a;		// 类型不匹配
    	//int **p2 = a;		// 类型不匹配
    	
    	// 指针指向二维数组的数组名
    	int (*p3)[5];		// 数组指针,指针指向一个数组,数组有5个int类型元素
    	p3 = a;				   a是二维数组的数组名,作为右值表示二维数组第一维的数组
    						   的首元素首地址,等同于&a[0]
    	p3 = &a[0];
    	
    	printf("a[0][3] = %d.\n", *(*(p3+0)+3));
    	printf("a[1][4] = %d.\n", *(*(p3+1)+4));
    	
    	// 指针指向二维数组的第一维
    	//int *p4 = &a[0];		// 不可以
    	int *p4 = a[0];			// a[0]表示二维数组的第一维的第一个元素,相当于是
    							   第二维的整体数组的数组名。数组名又表示数组首元素
    					       	   首地址,因此a[0]等同于&a[0][0];
    	
    	int *p5 = &a[0][0];	
    	printf("a[0][4] = %d.\n", *(p4+4));
    	int *p6 = a[1];
    	printf("a[1][1] = %d.\n", *(p6+1));
    	
    	// 指向二维数组的第二维
    	
    	
    	
    	return 0;
    }
    
    展开全文
  • C语言指针与维数组

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

    二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。以下面的二维数组 a 为例:
    int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };
    从概念上理解,a 的分布像一个矩阵:
    0 1 2 3
    4 5 6 7
    8 9 10 11
    但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存:

    在这里插入图片描述
    C语言中的二维数组是按行排列的,也就是先存放 a[0] 行,再存放 a[1] 行,最后存放 a[2] 行;每行中的 4 个元素也是依次存放。数组 a 为 int 类型,每个元素占用 4 个字节,整个数组共占用 4×(3×4) = 48 个字节。

    C语言允许把一个二维数组分解成多个一维数组来处理。对于数组 a,它可以分解成三个一维数组,即 a[0]、a[1]、a[2]。每一个一维数组又包含了 4 个元素,例如 a[0] 包含 a[0][0]、a[0][1]、a[0][2]、a[0][3]。

    假设数组 a 中第 0 个元素的地址为 1000,那么每个一维数组的首地址如下图所示:

    为了更好的理解指针和二维数组的关系,我们先来定义一个指向 a 的指针变量 p:
    int (p)[4] = a;
    括号中的
    表明 p 是一个指针,它指向一个数组,数组的类型为int [4],这正是 a 所包含的每个一维数组的类型。

    [ ]的优先级高于*,( )是必须要加的,如果赤裸裸地写作int *p[4],那么应该理解为int *(p[4]),p 就成了一个指针数组,而不是二维数组指针,这在《C语言指针数组》中已经讲到。

    对指针进行加法(减法)运算时,它前进(后退)的步长与它指向的数据类型有关,p 指向的数据类型是int [4],那么p+1就前进 4×4 = 16 个字节,p-1就后退 16 个字节,这正好是数组 a 所包含的每个一维数组的长度。也就是说,p+1会使得指针指向二维数组的下一行,p-1会使得指针指向数组的上一行。

    数组名 a 在表达式中也会被转换为和 p 等价的指针!

    下面我们就来探索一下如何使用指针 p 来访问二维数组中的每个元素。按照上面的定义:

    1. p指向数组 a 的开头,也即第 0 行;p+1前进一行,指向第 1 行。

    2. *(p+1)表示取地址上的数据,也就是整个第 1 行数据。注意是一行数据,是多个数据,不是第 1 行中的第 0 个元素,下面的运行结果有力地证明了这一点:

    #include <stdio.h>
    int main(){
        int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };
        int (*p)[4] = a;
        printf("%d\n", sizeof(*(p+1)));
    
        return 0;
    }
    

    运行结果:
    16

    1. *(p+1)+1表示第 1 行第 1 个元素的地址。如何理解呢?

    *(p+1)单独使用时表示的是第 1 行数据,放在表达式中会被转换为第 1 行数据的首地址,也就是第 1 行第 0 个元素的地址,因为使用整行数据没有实际的含义,编译器遇到这种情况都会转换为指向该行第 0 个元素的指针;就像一维数组的名字,在定义时或者和 sizeof、& 一起使用时才表示整个数组,出现在表达式中就会被转换为指向数组第 0 个元素的指针。

    1. ((p+1)+1)表示第 1 行第 1 个元素的值。很明显,增加一个 * 表示取地址上的数据。

    根据上面的结论,可以很容易推出以下的等价关系:
    a+i == p+i
    a[i] == p[i] == *(a+i) == *(p+i)
    a[i][j] == p[i][j] == *(a[i]+j) == *(p[i]+j) == ((a+i)+j) == ((p+i)+j)
    【实例】使用指针遍历二维数组。

    #include <stdio.h>
    int main(){
        int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
        int(*p)[4];
        int i,j;
        p=a;
        for(i=0; i<3; i++){
            for(j=0; j<4; j++) printf("%2d  ",*(*(p+i)+j));
            printf("\n");
        }
    
        return 0;
    }
    

    运行结果:
    0 1 2 3
    4 5 6 7
    8 9 10 11
    指针数组和二维数组指针的区别
    指针数组和二维数组指针在定义时非常相似,只是括号的位置不同:

    int *(p1[5]);  //指针数组,可以去掉括号直接写作 int *p1[5];
    int (*p2)[5];  //二维数组指针,不能去掉括号
    
    

    指针数组和二维数组指针有着本质上的区别:指针数组是一个数组,只是每个元素保存的都是指针,以上面的 p1 为例,在32位环境下它占用 4×5 = 20 个字节的内存。二维数组指针是一个指针,它指向一个二维数组,以上面的 p2 为例,它占用 4 个字节的内存。

    展开全文
  • 由于一维数组的元素本质上也是变量,因此,每个数组元素都有一个地址(指针)。 例如: int [10],*p,*q; p = &a[10]; q = &a[3]; 可以发现,这种数组元素地址的表示形式略显繁琐。 为了使用方便,C语言规定...

    C语言中,利用指针既可以间接引用单个变量,也可以间接引用数组的元素
    什么是指向一位数组元素的指针:
    由于一维数组的元素本质上也是变量,因此,每个数组元素都有一个地址(指针)。
    例如:
    int [10],*p,*q;
    p = &a[10];
    q = &a[3];

    可以发现,这种数组元素地址的表示形式略显繁琐。
    为了使用方便,C语言规定:
    可以用一个一维数组的数组名,来代表这个数组中0号元素的地址。
    例如,若有int a[10],*p;
    则p = a;
    等价于p = &a[0];
    这里的数组名a就代表了数组的首地址。
    若指针变量p指向某个一位数组中的某个元素的首地址,那么p+1将指向该数组中的下一个元素的首地址。

    1,若有一维数组a,那么a+i就是数组元素a[i]的地址(等价于&a[i])。
    2,(a+i)就代表a+i所指向的数组元素a[i]。
    (a+i)是数组元素a[i]的间接引用形式。

    例1:输入10个整数存入一维数组中,在按反序输出,限定不使用数组运算符(即[ ])。源代码如下:

    #include <stdio.h>
    int main(void){
        int a[10],i;
        printf("please input ten integrers:\n");
        for(i = 0;i <= 9;i++)
            scanf("%d",a+i);
        for(i = 9;i >= 0;i--)
            printf("%d",*(a+i));
        return 0;
    }
    

    3,若有一维数组a,且指针变量p指向了a[0],那么p+i就是数组元素a[i]的地址(等价于&a[i])。

    4,若有一维数组a,且指针变量p指向了a[0],那么*(p+i)就代表p+i所指向的数组元素a[i]。
    即*(p+i)是数组元素a[i]的间接引用形式。

    例2:输入10个整数存入一位数组中,再按反序输出,限定用指针变量访问数组元素。

    #include <stdio.h>
    int main(void){
        int a[10],i,
        *p = a;                //初始化形式
        printf("please input ten integrers:\n");
        for(i = 0;i <= 9;i++)
            scanf("%d",p+i);    /*等价于scanf("%d",&a[i])*/
        for(i = 9;i >= 0;i--)
            printf("%d",*(p+i));     /*等价于printf("%d",a[i])*
        return 0;
    }
    

    在例2中,虽然p是一个指针变量,但是p的值却始终没有改变。
    在循环中,是通过改变整形变量i的值来引用不同的数组元素的。
    因此,并未发挥指针变量可变的优势。
    下面是一个通过改变指针变量的值,引用不同的数组元素的例子。

    例3:输入10个整数存入一维数组中,再按反序输出。限定通过改变指针变量的值来引用不同的数组元素。

    以下是相应的源程序:

    #include <stdio.h>
    int main(void){
        int a[10],*p;
        for(p = a;p <= a+9;p++)
            scanf("%d",p);
        for(p = a + 9;p >= a;p--)
            printf("%d ",*p);
        return 0;
    }
    
    展开全文
  • 一维数组: 假如有一维数组如下: char a[3]; 该数组有3个元素,数据类型为char型,地址空间如下。 如果想访问数据,直接使用a[0]、a[1]、a[2]取出相应地址空间的值即可 一级指针指针即地址,char *b即...
  • 一.、二维数组元素的地址 定义如下二维数组: int a[3][4] = { {0,1,2,3}, {4,5,6,7}, {8,9,10,11} }; a为二维数组名,此数组有3...而它们中每个元素又是一个一维数组, 且都含有4个 元素 (相当于4列),例如: a[0]
  • 最近刚学C语言程序设计,学到...我知道指针也就是地址,但是在理解指针指向一维数组元素时,被弄得晕头转向。比如说,我定义 int a[10],*pa=a; 或int a[10],*pa=&a[10]; 时,a+i、pa+i、pa++ 分别表示什么意思?
  • #include <stdio.h> void reverse(int* a,int n){ int i,t; for ( i = 0;i< n/2; i++){ t=*(a+i); *(a+i)=*(a+9-i); *(a+9-i)=t; } } void main(){ int *p; int a[10]={0,1,2,3,4,5,6,7,8,9};...
  • 指针是如何个char数组的 天翼云盘中 我的备份>录屏文件>复刻C4
  • 主要给大家介绍了关于C语言中二维数组作为函数参数来传递的三种方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • 新手必知之c语言一维数组与指针

    千次阅读 2019-01-26 12:41:56
    一、简述一维数组与指针 (1)在C语言中,数组是占用一串连续的存储单元。数组中每个元素都可以看作一个变量,因此每个数组元素都有一个地址。 那么:int *p,a[5]={1,2,3,4,5}; 指针p的基类型是int,数组a的各个...
  • C语言指针学习 二维数组求行平均值

    千次阅读 2020-11-01 17:41:58
    维数组求行平均值 Description 输入3×3的二维数组,求每行元素的平均值。 Input 输入3×3个数据。 Output 输出每行的平均值。每个数据各占行。保留1位小数。 Sample Input 95 68 78 65 77 88 94 82 73 ...
  • C语言指针引用二维数组

    千次阅读 2016-12-07 16:53:11
    1.二维数组的元素: a[0][1] 2.二维数组的地址: 2.1 0行首地址:a 2.2 1行0列元素地址:a[1] 2.3 1行首地址 : a+1 二.用取地址符(当然只能表示数组的地址) 1.0行首地址:&a[0] 2.元素
  • 维数组最大值及位置 Description 有个3*4的矩阵,要求编程求出其中值最大的那个元素,以及其所在的行号和列号。(如果最大数有多个,则显示第1个出现的数据的信息) Input 从键盘输入12个数字组成个3*4的...
  • 今天把指针一维数组的知识,做一个简要的总结。 int liv_arr[] = {11, 22, 33, 44, 55}; int * lpv_sum = liv_arr; printf("liv_arr[2]=%d *(lpv_sum+2)=%d *(liv_arr+2)=%d\n", liv_arr[2], *(lpv_sum+2), *...
  • 指针与一维数组

    千次阅读 2018-07-28 15:15:12
    对于数组a,a的值&amp;a[0]相等 int a[] = { 1,2,3,4,5 }; int *p = a; printf("%p %p %p\n", a, &amp;a[0], p); 我们发现三者地址相同 2.指针操作数组 1)把指针当作数组名来使用 ...
  • 指针与一维数组 一维数组名 ​ 一维数组名是个指针常量(不能改变) ​ 存放的是一维数组第一个元素的地址 下标和指针的关系 ​ 如果p是个指针变量, ​ 则p[i] 永远等价于 *(p+i) 理解: 定义数组a ,p指向a,...
  • C语言指针的理解5:二重指针与维数组1.二重指针1.1 二重指针与普通指针的区别1.2 二重指针的用法1.3 一些概念的实质2.二维数组2.1 二维数组的内存映像2.2 二维数组下标理解和访问2.3 二维数组的应用和更多...
  • C语言二重指针与维数组

    千次阅读 2019-07-23 21:51:28
    一、多维数组元素的地址 设有一个二维数组a,它有3行4列。它的定义为: ...而每一元素又是一个一维数组,它包含4个元素(即4个列元素),例如,a[0]所代表的一维数组又包含4个元素: a[0][0], a[0][1]...
  • C语言之指向一维数组指针

    万次阅读 多人点赞 2018-04-17 11:41:53
    int array[5] = {1, 2, 3, 4, 5}; // 定义数组 ...上述三条语句分别定义了数组, 指向数组元素的指针和指向数组指针. 内存情况如图示: 对于指向数组元素的指针很好理解, 但是怎样理解 指向数组指针...
  • 一维数组指针: 对于一位数组和指针是很好理解的: 一维数组名: 对于这样的一维数组:int a[5]; a作为数组名就是我们数组的首地址, a是一个地址常量 . 首先说说常量和变量的关系, 对于变量来说, 用箱子去比喻再...
  • 通过指针来访问一维数组,二维数组,多维数组 */ #include const int COLS=3; const int COUNT=4; //通过一级指针,计算偏移量来遍历一维数组 void printSingleDimensionalArray(int *data,int data_len); //通过一...
  • 文章目录一维数组指针和二维数组指针的定义一维数组指针和二维数组指针用于索引数组元素一维数组指针和二维数组指针的可视化解读 一维数组指针和二维数组指针的定义 一维数组指针的定义就是普通指针的定义 指针变量...
  • 目录1 用指针访问数组的三种方式2 一维数组做函数的参数2.1 方法一2.2 方法二3 指针自增自减运算 1 用指针访问数组的三种方式 #include <stdio.h> int main() { int array[5] = {5, 10, 15, 20, 25}; int i...
  • 维数组指针表示,C语言指针引用二维数组详解

    千次阅读 多人点赞 2019-12-09 14:43:53
    指针变量可以指向一维数组中的元素,当然也就可以指向二维数组中的元素。但是在概念和使用方法上,二维数组的指针一维数组指针要复杂一些。要理解指针和二维数组的关系首先要记住一句话:二维数组就是一维数组,...
  • LOGO 数组与指针一维数组地址和指针 主讲人周芸 教学目标 掌握一维数组的指针的用法 理解一维数组指针的本质 具备应用一维数组指针编程的能力 张丽去排队打疫苗医生通过叫号的方式依次注射 引入 一指向一维数组的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,306
精华内容 14,922
关键字:

c语言指针与一维数组

c语言 订阅