1、概述
杨辉三角作为C语言常见的练习题有着很多的解法,本文将利用该题从而理解数组与指针之间的相关性,杨辉三角是二项式系数在三角形中的一种几何排列如下图
2、解题思路、
(1)数组
从上图可以看出如果将空白处补0那么除首行的1以外其他的数都满其上一行的相邻的两个数的和,那么可以看出它的行与列之间的关系,这样我们就可以想到,利用二维i数组可以实现,一个行列的结构,代码如下
#include<stdio.h>
int main(int argc, char const *argv[])
{
int a[32][32]={};//为防止数组越界,将数组定义的大些
a[1][1]=1;//定义初始的1,其余为0
for (int i = 2; i < 10; i++)
for (int j = 1; j <= i; j++)
a[i][j]=a[i-1][j]+a[i-1][j-1];
//*****************************************************************************************
for (int i = 0; i < 10; i++)//循环遍历
{
for (int j = 0; j <= i+1; j++)
printf("%-4d",a[i][j]);
putchar('\n');//换行
}
return 0;
}
这里为防止数组越界问题发生,要将二维数组定义的大一些,比你想要打印的行数还要大一行一列,for循环i从2开始是为了将第一列空位0,j从1开始就是从每一行第二列开始赋值,程序运行结果如下
调整循环遍历即可打印正常的杨辉三角(将0去除版)
至此我们就完成了用二维数组的方法打印杨辉三角了,有人可能会觉得本文跑题了,其实先用二维数组完成杨辉三角会让我们更好的理解指针的方法
(2)指针
指针的本质是地址,指针变量是变量,该变量是用来存储地址的。我们只要理解了这一点,那么就可以用指针替换二维数组了,因为数组名及是数组的首地址,我们只需定义个指针变量指向数组的首地址,对数组的地址进行操作就可以赋予数组元素值了;
#include<stdio.h>
int main(int argc, char const *argv[])
{
int a[32][32]={};//为防止数组越界,将数组定义的大些
int (*p)[32]=a;
*(*(p+1)+1)=1;//将p(行地址)+1,转为第二行第一列,*(p+1)将行地址降级成列地址,+1平移第二行第二列的地址,*(*(p+1)+1)取地址内容
for (int i = 2; i < 10; i++)
for (int j = 1; j <= i; j++)
*(*(p+i)+j)=*(*(p+i-1)+j)+*(*(p+i-1)+(j-1));
for (int i = 0; i < 10; i++)//循环遍历
{
for (int j = 0; j <= i+1; j++)
printf("%-4d",*(*(p+i)+j));
putchar('\n');//换行
}
return 0;
}
将p(行地址)+i,转为第i行第一列,*(p+i)将行地址降级成列地址,+j平移第i行第j列的地址,*(*(p+i)+j)取地址内容进行赋值等效于a[i][j]。结果如下
到此我们就完成了用指针打印杨辉三角。
3.结语
本文利用二维数组作为中间过渡,进而实现指针打印杨辉三角。
最后谢谢大家的观看,本人也是初入C语言的后辈,如有错误请各位前辈指正