Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2035081
  • 博文数量: 414
  • 博客积分: 10312
  • 博客等级: 上将
  • 技术积分: 4921
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-31 01:49
文章分类

全部博文(414)

文章存档

2011年(1)

2010年(29)

2009年(82)

2008年(301)

2007年(1)

分类: C/C++

2010-06-14 19:27:54

平时比较常见的是杨辉三角的题目的程序,都是直接用main函数来书写的,这是很鸡肋的办法,其实要是失业相应的函数调用来写,你就会发现,使用main的方法的数组调整的方式,如果移植到函数调用里,几乎在现实中式完全不能够运行的
其中难点就再于二级指针和二维数组的区别,转换,如何进行接引,反解引的问题,其实这个问题你如果明白了,你就相当于明白了C或者C++编译器是如何解释和读取二维数组的数组内容,编译器是如何实现对二维数组的的定位等等问题。
希望对新入代码业的朋友们能有些帮助,如有纰漏,不吝赐教,谢谢!
下面是关键的知识点
对于数组 int p[m][n];
如果要取p[i][j]的值(i>=0 && i
   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);
 
下面是我的代码,最后面的注释是程序的输出:
view plaincopy to clipboardprint?
/* 
 * yanghui.cc 
 * 
 *  Created on: 2010-6-14 
 *      Author: LiuFeng 
 *       Email:  
 */   
 
#include   
#include    
 
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    *((int*)a+i*sz+0)=1;  
    *((int*)a+i*sz+i)=1;  
  }   
 
  for(int i=2;i    for(int j=1;j      *((int*)a+i*sz+j) = (*((int*)a+(i-1)*sz+j))+ (*((int*)a+(i-1)*sz+(j-1)));  
    }   
 
  for(int i=0;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  
 
 */ 
  
/*
 * yanghui.cc
 *
 *  Created on: 2010-6-14
 *      Author: LiuFeng
 *       Email:
 */
#include
#include
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    *((int*)a+i*sz+0)=1;
    *((int*)a+i*sz+i)=1;
  }
  for(int i=2;i    for(int j=1;j      *((int*)a+i*sz+j) = (*((int*)a+(i-1)*sz+j))+ (*((int*)a+(i-1)*sz+(j-1)));
    }
  for(int i=0;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
 */
  
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/asiainfolf/archive/2010/06/14/5671036.aspx
阅读(1303) | 评论(0) | 转发(0) |
0

上一篇:alternatives命令用法

下一篇:鲜果

给主人留下些什么吧!~~