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("\n");
  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("\n**********************\n");
  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("\n");
    }
}

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

 

posted @ 2013-06-19 16:23  tsembrace  阅读(1067)  评论(0编辑  收藏  举报