精华内容
下载资源
问答
  • 指针和一维数组关系

    千次阅读 2019-05-16 20:24:18
    指针和数组的关系是比较高级的内容,他分为指针和一维数组关系指针和一维数组关系。其中前者是重点,而且更复杂一点。我们主要掌握指针和一维数组关系。二维数组本身就用的比较少,指针和二维数组的关系用得...

    指针和数组的关系是比较高级的内容,他分为指针和一维数组的关系,指针和一维数组的关系。其中前者是重点,而且更复杂一点。我们主要掌握指针和一维数组的关系。二维数组本身就用的比较少,指针和二维数组的关系用得就更少了。指针和二维数组的关系我们后面会讲到,但是不是重点。

    用指针引用数组元素

    引用数组元素可以用“下标法”,这个在前面已经讲过了,也用过了,但是除了这种方法之外还可以使用指针,即通过指向某一个元素的指针变量来引用数组元素。数组包含若干种元素,元素就是变量,变量都有地址。所以每一个数组在内存中都占用存储单元,都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素。同样,数组的类型和指针变量的基类型一定要相同

    #include<stdio.h>
    int main(void)
    {
    	int a[] = {1, 2, 3, 4, 5};
    	int *p = &a[0];
    	int *q = a;
    	printf("*p = %d, *q = %d\n", *p, *q);
    	return 0;
    }
    

    在这里插入图片描述
    程序中定义了一个一维数组 a,他有 5个元素,即 5 个变量,分别为 a[0],a[1],a[2],a[3],a[4];且a[0],a[1],a[2],a[3],a[4]分别为这五个变量的变量名,所以p = &a[0]就表示将 a[0]的地址放到指针变量 p 中,即指针变量 p 指向数组 a 的第一个元素 a[0].而C语言中规定,“数组名”是一个指针“常量”,表示数组第一个元素的起始

    展开全文
  • 指针和一维数组

    2018-04-09 10:38:08
    指针和一维数组的讲解,本人觉得挺好的,给大家分享下,适合一些小白
  • 一.、二维数组元素的地址 定义如下二维数组: int a[3][4] = { {0,1,2,3}, {4,5,6,7}, {8,9,10,11} }; a为二维数组名,此数组有3...而它们中每个元素又是一个一维数组, 且都含有4个 元素 (相当于4列),例如: a[0]

    一.、二维数组元素的地址
    定义如下二维数组:

        int a[3][4] = { {0,1,2,3},  {4,5,6,7},  {8,9,10,11} }; 
    
        a为二维数组名,此数组有3行4列, 共12个元素。但也可这样来理解,数组a由三个元素组成:a[0], a[1], a[2]。而它们中每个元素又是一个一维数组, 且都含有4个元素 (相当于4列),例如: a[0]所代表的一维数组所包含的 4 个元素为 a[0][0],a[0][1], a[0][2], a[0][3]。如图.所示: 
    
                ┏━━━━┓    ┏━┳━┳━┳━┓ 
        a─→    ┃ a[0] ┃─→ ┃0 ┃1 ┃2┃3 ┃ 
                ┣━━━━┫    ┣━╋━╋━╋━┫ 
                ┃  a[1] ┃─→┃4 ┃5 ┃6 ┃7┃ 
                ┣━━━━┫    ┣━╋━╋━╋━┫ 
                ┃  a[2] ┃─→┃8 ┃9┃10┃11┃ 
                ┗━━━━┛    ┗━┻━┻━┻━┛ 
    
        但从二维数组的角度来看,a代表二维数组的首地址,当然也可看成是二维数组第0行的首地址。a+1就代表第1行的首地址,,a+2就代表第2行的首地址。如果此二维数组的首地址为1000, 由于第0行有4个整型元素,所以a+1为1008,a+2 也就为1016。如图.所示: 
    
                     a[3][4] 
                     a ┏━┳━┳━┳━┓
              (1000)─→┃0┃1 ┃2 ┃3┃ 
                   a+1 ┣━╋━╋━╋━┫ 
             (1008)─→ ┃4┃5 ┃6 ┃7┃ 
                   a+2 ┣━╋━╋━╋━┫ 
              (1016)─→┃8┃9┃10┃11┃ 
                       ┗━┻━┻━┻━┛ 
    
        既然我们把a[0],a[1],a[2]看成是一维数组名,可以认为它们分别代表它们所对应的数组的首地址,也就是讲,a[0]代表第 0 行中第 0 列元素的地址,即&a[0][0],a[1]是第1行中第0列元素的地址,即&a[1][0]。根据地址运算规则,a[0]+1即代表第0行第1列元素的地址, 即&a[0][1]。 一般而言,a[i]+j 即代表第 i 行第j列元素的地址, 即&a[i][j]。 
    
       另外,在二维数组中,我们还可用指针的形式来表示各元素的地址。如前所述,a[0] 与 *(a+0) 等价,a[1] 与 *(a+1) 等价,因此 a[i]+j 就与 *(a+i)+j 等价,它表示数组元素a[i][j]的地址。 
    
       因此,二维数组元素 a[i][j] 可表示成 *(a[i]+j) 或 *(*(a+i)+j),它们都与 a[i][j ]等价,或者还可写成 (*(a+i))[j]。
    
      另外, 要补充说明一下,如果你编写一个程序输出打印 a 和 *a,你可发现它们的值是相同的,这是为什么呢?我们可这样来理解:首先,为了说明问题,我们把二维数组人为地看成由三个数组元素 a[0],a[1],a[2] 组成,将 a[0],a[1],a[2] 看成是数组名它们又分别是由4个元素组成的一维数组。因此,a表示数组第 0 行的地址,而 *a 即为a[0],它是数组名,当然还是地址,它就是数组第 0 行第 0 列元素的地址。
    

    二.、指向二维数组的指针

       定义如下的指针变量:
    
       int (*p)[3];
    
       指针 p 为指向一个由3个元素所组成的整型数组指针。在定义中,圆括号是不能少的,否则它是指针数组。这种数组的指针不同于整型指针,当整型指针指向一个整型数组的元素时,进行指针(地址)加1运算,表示指向数组的下一个元素,此时地址值增加了2(因为放大因子为2), 而如上所定义的指向一个由3个元素组成的数组指针,进行地址加1运算时,其地址值增加了6(放大因子为2x3=6)。例如: 
    
        int a[3][4];
    
        int (*p)[3];
    
        p = a; 
    
       开始时 p 指向二维数组第 0 行, 当进行 p+1 运算时,根据地址运算规则,此时放大因子为 4x2=8,所以此时正好指向二维数组的第 1 行。和二维数组元素地址计算的规则一样,*p+1 指向 a[0][1],*(p+i)+j 则指向数组元素 a[i][j]。 
    
    #include <stdio.h>  
    #include <stdlib.h>  
    
    int main()   
    {   
        int a[3][4] = {{1,3,3,4}, {5,6,7,8}, {9,10,11,12}};  
        int i;  
        int (*p)[4];  
    
        p = a + 1;                                  // p 指向二维数组的第1行,此时 *p[0]或 **p 是 a[1][0]  
        for(i = 1; i <= 4; p = p[0]+2,i++)   // 修改 p 的指向,每次增加2  
        {  
            printf("%d\t", *p[0]);  
        }  
        printf("\n");  
        for(i = 0; i < 2; i++)  
        {  
            p = a + 1;                          // 修改 p 的指向,每次跳过二维数组的一行  
            printf("%d\t", *(p[i]+1));  
        }  
        printf("\n");  
    
        return 0;  
    } 
    展开全文
  • 指针一维数组: #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. 下面是为一维数组 / 二维数组 / 三维数组 动态分配内存 实现的代码: // 一维数组动态申请,a数组大小为: n int *a = new int[n]; // 二维数组动态申请,b数组大小为: n*p int **b = new int*[n]; ...

    1. 下面是为一维数组 / 二维数组 / 三维数组 动态分配内存 实现的代码:

    // 一维数组动态申请,a数组大小为: n 
    int *a = new int[n]; 
    // 二维数组动态申请,b数组大小为: n*p 
    int **b = new int*[n]; 
    for(int i=0; i<n; i++) 
    {
        b[i] = new int[p];
    }
     // 三维数组动态申请, c数组大小为: m*n*p: 
    int ***c = new int **[m]; 
    for(int i=0; i<m; i++) 
    {
        c[i]=new int *[n]; 
        for(int j=0; j<n; j++)
        { 
            c[i][j] = new int [p]; 
        }
    } 

    2. 下面图片比较形象的说明为指针分配内存的问题:

    这里写图片描述

    3. 当不再需要一个动态分配的多维数组时,可按以下步骤释放它所占用的空间:

    • 首先释放在for循环中为每一行所分配的空间。
    • 然后释放行指针分配的空间。
    // 一维空间释放: 
    delete []a; 
    a = 0; //可在释放空间后将a置为0,以防继续访问已被释放的空间。这句可以不要。
    // 二维空间释放: 
    for (int i=0; i<n; i++) 
    {
        delete [] b[i]; 
    }
    delete []b; 
    b = 0; //可在释放空间后将b置为0,以防继续访问已被释放的空间。这句可以不要。 
    // 三维空间释放: 
    for (int i=0; i<m; i++) 
    { 
        for(int j=0; j<n; j++) 
        {
            delete []c[i][j]; 
        }
        delete []c[i]; 
    } 
    delete []c; 
    c = 0; //可在释放空间后将c置为0,以防继续访问已被释放的空间。这句可以不要。
    展开全文
  • c++用指针遍历一维数组和二维数组

    千次阅读 2016-12-01 22:28:33
    //统计个字符数组里面字符出现个数 void main(){ char str1[100], temp; cin.getline(str1,100); cin >> temp;  int count = 0; for (char *P; p if (*p == temp)count++; } cout system("pause"); }
  • 1、 对于任意二维数组 int a[ROW][COLUMN] 来说, a+i 表示行指针,而 a[i] 标识列指针(其中 i 表示某个整形值) ,行指针转化为列指针是通过在行指针前面加“ * ”运算符做到,而列指针转化为行指针是通过“ &...
  • C语言指针重点难点整理(详解)(包括一维数组,二维数组的元素指针,二维数组的行指针做函数参数,指针数组,行指针数组) 笔者学指针之前: 呵呵,听闻指针是C语言的难点,我倒要见识一下,到底有多难 笔者学完...
  • 维数组指针表示,C语言指针引用二维数组详解

    千次阅读 多人点赞 2019-12-09 14:43:53
    要理解指针和二维数组的关系首先要记住一句话:二维数组就是一维数组,这句话该怎么理解呢? 假如有一个二维数组: int a[3][4] = {{1, 3, 5, 7}, {9, 11, 13, 15}, {17, 19, 21, 23}}; 其中,a 是二维数组名...
  • 通过指针来访问一维数组,二维数组,多维数组 */ #include const int COLS=3; const int COUNT=4; //通过一级指针,计算偏移量来遍历一维数组 void printSingleDimensionalArray(int *data,int data_len); //通过一...
  • 概念详解:指针指针与“int a”,...一维数组:定义一维数组之后,即在内存中分配一段连续的地址空间,如C语言中,int num[5],在32位系统中,int占据4个字节,现假设num[0]的地址空间为0x00000004,那么num[...
  • 指针一维数组 指针移动方式访问数组元素: int a[5], *p; // a存放了数组的首地址 p=a; // 数组首地址赋给p p++; // 向下移动4个字节 指针与数组名都是地址,因此可以混合使用访问数组元素。...
  • 数组指针,指向一个一维数组指针,又称行指针,被二维数组赋值后可当作二维数组操作。 例: int a[2][3]; a[1][2]=5; int (*b)[3]=a; cout<<a[1][2]; cout<<(*(b+1))[2]; cout<<b[1][2]; ...
  • 通过指针引用二维数组

    千次阅读 2019-05-25 08:46:18
    指针变量可以指向一维数组中的元素,当然也就可以指向二维数组中的元素,但是在概念使用方法上,二维数组的指针一维数组指针复杂一些。要理解指针和二维数组的关系首先要记住一句话: 二维数组就是一维数组 ...
  • C语言课件:9-2指针一维数组.ppt
  • 指针和维数组

    千次阅读 2012-02-10 18:19:51
    我们知道,一个二维数组在计算机中存储时,是按照先行后列的顺序依次存储的,当把每一行看作一个整体,即视为一个大的数组元素时,这个存储的二维数组也就变成了一个一维数组了。而每个大数组元素对应二维数组的一行...
  • 维数组指针指针数组、数组指针的用法

    万次阅读 多人点赞 2018-03-12 18:16:20
    二维数组和指针⑴ 用指针表示二维数组元素。要用指针处理二维数组,首先要...而每个大数组元素对应二维数组的一行,我们就称之为行数组元素,显然每个行数组元素都是一个一维数组下面我们讨论指针和二维数组元素的...
  • 首先,因为"[ ]" 的优先级要比" * "的优先级要高,所以所以p1[5]首先是数组,然后其元素类型为整型指针类型。我们可以称为指针类型的数组,简称指针数组。 1.2数组指针 int (*p2)[5];数组指针 指针变量名为p2...
  • 在c语言中用二级指针指向一维数组,(*变量名)的值为什么与数组名的值不一样啊![图片说明](https://img-ask.csdn.net/upload/201801/21/1516535735_222948.png)
  • p为指向整型二维数组指针变量,二维数组的列数为n int *p() p为返回指针值的函数,该指针指向整型量 int (*p)() p为指向函数的指针,该函数返回整型量 int **p p为个指向另一指针指针变量,该指针指向个...
  • LOGO 数组与指针一维数组地址指针 主讲人周芸 教学目标 掌握一维数组的指针的用法 理解一维数组指针的本质 具备应用一维数组指针编程的能力 张丽去排队打疫苗医生通过叫号的方式依次注射 引入 一指向一维数组的...
  • 使用一维数组指针遍历二维数组

    千次阅读 2016-06-26 09:34:36
    //使用一维数组打印二维数组#include <stdio.h>void print_array(int* a,int length) { int i = 0; for(i=0;i;i++) { printf("%d: %d\n",i,a[i]); } }int main(void) { int a[3][3] = {{1,2,3

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 118,957
精华内容 47,582
关键字:

指针和一维数组的关系