zoukankan      html  css  js  c++  java
  • C Primer+Plus(十)

    要点记录:

    1、对于二维数组int a[2][3],如何使用指针变量指向该二维数组?

    二维数组本质上是一维数组的数组,对本例来说,a[2][3]实质上也可以理解为包含2个数组元素的数组,每个数组元素含3个元素。

    即:a[0]元素={1,2,3};a[1]元素={4,5,6};

    若声明一个整型指针变量int *p;能否使得p=a?

    p是一个指针,即地址;a是数组名,也为地址。从这点而言,两者是匹配的。但p指向的地址存储的是整型变量(简言之,p指向整型变量),而a指向的是什么?a指向一个二维数组。两者的指向类型是不匹配的。

    正确的二维数组指针变量的表示如下:

    int a[2][3];   //两行三列

    int (*pa)[3]; //可以这样来看:先把括号内的去掉得int [3],所以说明pa指向的是一个包含3个整型元素的数组

    pa=a; //使得p指向二维数组a的首个数组元素,即第0行首地址

    注意int (*pa)[3] 不能省略括号,因为*优先级低于[],而对于int *pa[3]表示的是一个指针数组,每个数组元素均为指向整型变量的指针。

    10.13编程练习

    1、编写一个程序,初始化一个double数组,然后把数组内容复制到另外两个数组(3个数组都需要在主程序里声明)。制作第一份拷贝的函数使用数组符号。制作第二份拷贝的函数使用指针符合。以目标数组名和要复制的元素数目作为参数。

    #include<stdio.h>
    int main(void)
    {
      void copy_arr(double x[],double y[],int);
      void copy_ptr(double *x,double *y,int);
      double source[5]={1.1,2.2,3.3,4.4,5.5};
      double target1[5];
      double target2[5];
      int i;
      copy_arr(source,target1,5);
      copy_arr(source,target2,5);
      for(i=0;i<5;i++)
      {
        printf("%f  ",target1[i]);
      }
      getch();
      printf("
    ");
      for(i=0;i<5;i++)
      {
        printf("%f  ",*(target2+i));
      }
      getch();
      return 0;
    }
    void copy_arr(double x[],double y[],int m)
    {
      int i;
      for(i=0;i<m;i++)
        y[i]=x[i];
    }
    void copy_ptr(double *x,double *y,int m)
    {
      int i;
      for(i=0;i<m;i++,y++,x++)
        *y=*x;
    }

    2、编写一个程序,初始化3×5二维数组,并利用一个基于变长数组的函数将其复制到另一个二维数组。再编写一个基于变长数组的函数来显示两个数组的内容。这两个函数应该能处理任意的N*M数组。

    #include<stdio.h>
    int main()
    {
      void copy_ary(int m,int n,int a[m][n],int b[m][n]);
      void show_ary(int m,int n, int a[m][n]);
      int a1[3][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
      int a2[3][5];
      copy_ary(3,5,a1,a2);
      show_ary(3,5,a1);
      getch();
      printf("
    **********************
    ");
      show_ary(3,5,a2);
      getch();
      return 0;
    }
    void copy_ary(int m,int n,int a[m][n],int b[m][n])
    {
      int i,j;
      for(i=0;i<m;i++)
        for(j=0;j<n;j++)
           *(*(b+i)+j)=a[i][j];
    }
    void show_ary(int m,int n, int a[m][n])
    {
      int i,j;
      for(i=0;i<m;i++)
        {for(j=0;j<n;j++)
           printf("%d  ",*(a[i]+j));
         printf("
    ");
        }
    }

    TC3.0居然不支持变长数组。。。

  • 相关阅读:
    常用正则总结
    JavaScript中with语句的理解
    设置点击文本框或图片弹出日历控件
    设置时间 new Date
    windows 下配置 nginx的问题
    CSS3滚动条-webkit-scrollbar
    /、./、../ 的区别
    js中如何获取纯正的undefined?
    关于渐进增强和优雅降级
    每日一练-第三期
  • 原文地址:https://www.cnblogs.com/tsembrace/p/3143834.html
Copyright © 2011-2022 走看看