【原创】杨辉三角之函数调用版本

平时比较常见的是杨辉三角的题目的程序,都是直接用main函数来书写的,这是很鸡肋的办法,其实要是失业相应的函数调用来写,你就会发现,使用main的方法的数组调整的方式,如果移植到函数调用里,几乎在现实中式完全不能够运行的

其中难点就再于二级指针和二维数组的区别,转换,如何进行接引,反解引的问题,其实这个问题你如果明白了,你就相当于明白了C或者C++编译器是如何解释和读取二维数组的数组内容,编译器是如何实现对二维数组的的定位等等问题。

希望对新入代码业的朋友们能有些帮助,如有纰漏,不吝赐教,谢谢!

 

下面是关键的知识点

对于数组 int p[m][n];

如果要取p[i][j]的值(i>=0 && i<m && 0<=j && j < n),编译器是这样寻址的,它的地址为:

   p + i*n + j;

从以上可以看出,如果我们省略了第二维或者更高维的大小,编译器将不知道如何正确的寻址。但是我们在编写程序的时候却需要用到各个维数都不固定的二维数组作为参数,这就难办了,编译器不能识别阿,怎么办呢?不要着急,编译器虽然不能识别,但是我们完全可以不把它当作一个二维数组,而是把它当作一个普通的指针,再另外加上两个参数指明各个维数为二维数组手工寻址,这样就达到了将二维数组作为函数的参数传递的目的,根据这个思想,我们可以把维数固定的参数变为维数随即的参数,例如:

    void Func(int array[3][10]);

    void Func(int array[][10]);

变为:

    void Func(int **array, int m, int n);

在转变后的函数中,array[i][j]这样的式子是不对的,因为编译器不能正确的为它寻址,所以我们需要模仿编译器的行为把array[i][j]这样的式子手工转变为:

    *((int*)array + n*i + j);

 

 

下面是我的代码,最后面的注释是程序的输出:

 

/* * yanghui.cc * * Created on: 2010-6-14 * Author: LiuFeng * Email: sohu2000000@hotmail.com */ #include <cstdio> #include <iostream> using namespace std; int triDisplay(int** a, int row, int col){ if(row != col){ perror(“must : row=col”); return (-1); } int sz=row; printf(“/n”); for(int i=0;i<sz;++i){ *((int*)a+i*sz+0)=1; *((int*)a+i*sz+i)=1; } for(int i=2;i<sz;++i) for(int j=1;j<i;++j){ *((int*)a+i*sz+j) = (*((int*)a+(i-1)*sz+j))+ (*((int*)a+(i-1)*sz+(j-1))); } for(int i=0;i<sz;++i){ for(int j=0;j<=i;++j){ printf(“%5d”, *((int*)a+i*sz+j) ); } printf(“/n”); } } int main(void){ int data[10][10]; int size=10; triDisplay((int**)data,size,size); int s = fac(5); cout << “/n/ns=”<< s << endl; return 0; } /* [Administrator@ /<7>06/14]$ g++ -g -O3 -o tri yanghui.cc [Administrator@ /<7>06/14]$ ./tri.exe 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 */  

 

    原文作者:杨辉三角问题
    原文地址: https://blog.csdn.net/eric_liufeng/article/details/5671036
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞