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居然不支持变长数组。。。