#include <stdio.h>
#include <stdlib.h>
void solve(int ***ptr_nums, int n)
{
int size;
int s = 0;
for (size = 1; s < n; size++)
{
s += size;
}
size -= 1;
*ptr_nums= (int**) malloc(sizeof(int*)*size) ;
int i,j,cnt=1;
for(i=0;i<size;i++) {
(*ptr_nums)[i]=(int*) malloc(sizeof(int)*size) ;
}
for( i=1;i<=size;i++) {
for( j=0;j<i;j++) {
if(cnt<=n){
(*ptr_nums)[i-1][j]= cnt;
} else{
(*ptr_nums)[i-1][j]= -1;
}
cnt++;
}
}
}
int main(int argc, const char *argv[])
{
int n;
scanf("%d", &n);
int **nums;
solve(&nums, n);
int size;
int s = 0;
for (size = 1; s < n; size++)
{
s += size;
}
size -= 1;
int i,j;
for ( i = 1; i <= size; i++)
{
for ( j = 0; j < i; j++)
{
printf("%d", nums[i - 1][j]);
}
printf("\n");
free(nums[i - 1]);
}
free(nums);
return 0;
}
具体的代码如上,这是一道题目的答案,而这道题着重需要思考的如何在函数中中构造一个出一个二维数组,我们都知道,可以通过二级指针来构造出一个二维数组,那么如何在一个非主函数的函数即上方的函数solve呢?
1.首先必须声明一点,传入solve中的指针必须为三级指针,因为如果是二级指针,solve函数就只是得到了一个二级指针的副本,而我们无论如何对二级指针进行操作,都不会影响到主函数,因此在这里,我们必须使用三级指针;
2.还有这个地方构造二维数组时,必须切记要写成(*p)[][]这种形式,这个原因是*的运算优先级很低,如果你写成这样*p[][],那你输入的数据可能就无法写到正确的位置,导致程序报错.
3.如果不会在主函数里构造二维数组,可以点开C语言中如何定义动态二维数组并输出_吴贝贝的博客-CSDN博客,他写的非常清楚,你完全可以照猫画虎的在函数中写,只要注意我上面的提醒事项就好
4.