鸦领主 发表于 2021-1-11 17:04:48

C语言学习 二维数组 指针数组 函数指针

1.指针数组

指针数组:char *p={ar,&n,NULL}; //每个元素都是char*,成员都是一级指针
一级指针:int*p=&n; //一级指针变量p,指向普通变量,为了远程操控普通变量储存的数据

二级指针:char**c=&p; //二级指针变量c,指向一级指针变量p,操控一级指针指向其他地址

malloc堆内申请
在栈内申请一个变量:int i =10;
在堆内申请一个变量:int *i=(int*)malloc(sizeof(int)), *i=10;
-
在栈内申请一个数组:int i ;
在堆内申请一个数组:int *i=(int*)malloc(sizeof(int)*10)
-
在栈内申请一个指针数组:int *i ;
在堆内申请一个指针数组:int **i=(int**)malloc(sizeof(int*)*10)

2.二维数组

二维数组:int n;//意思是有3个一维数组,每个一维数组有12个元素
初始化:int n={{1,2,3},{4,5},{1}};//用双层大括号初始化,缺省默认为0
行指针:可以指向二维数组int (*p)=ar
srand函数和sand函数:
srand函数是随机数发生器的初始化函数,如果去掉srand,那么无论何时运行这个程序,都会产生10个相同的数。
sand函数是产生随机数

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
    srand((unsigned)time(0));
    int i;
    int n = 0;
    while (n < 3)
    {
      int j = 0;
      while (j < 12)
      {
            i = 300 + rand() % 500 + 1;//随机生成300-801之间的数字
            j++;
      }
      n++;
    }
    //在生成所有二维数组的数据后,按照3行12列输出每年每月的费用支出
    n = 0;
    while (n < 3)
    {
      printf("第%d年:\n", n+1);
      int j = 0;
      while (j < 12)
      {
            printf("%d",i);
            j++;
      }
      puts("\n");
      n++;
    }
    //统计三年中,36个月每月平局支出费用
    n = 0;
    double d = 0;
    while (n < 3)
    {
      int j = 0;
      while (j < 12)
      {
            d += i;
            j++;
      }
      n++;
    }
    printf("3年平局每个月支出%0.2lf元\n", d / 36);
    //统计每一年的支出费用和每月平局支出费用
    n = 0;
    while (n < 3)
    {
      double d = 0;
      int j = 0;
      while (j < 12)
      {
            d += i;
            j++;
      }
      printf("第%d年总支出是%0.lf元,平局每个月支出%0.2lf元\n",n+1,d, d / 12);
      n++;
    }
    //统计3年中,一月的平局费用,哪一年的一月支出费用高...十二月的平均费用,哪一年的十二月支出费用高
    int j = 0;
    double t = 0;
    int k = 0;
    while (j<12)
    {
      double d = 0;
      int n = 0;
      while (n<3)
      {
            d += i;
            n++;
      }
      if (d > t)
      {
            t = d;
            k = n;
      }
      printf("平局3年%d月支出%0.2lf元\n",j+1,d/3);
      j++;
    }
    printf("3年中支出最多的月份是%d,平均%0.2lf元\n",k + 1, t/3);
    return 0;
}
把各个条件定义成函数

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void random(int i[])
{
    srand((unsigned)time(0));
    int n = 0;
    while (n < 3)
    {
      int j = 0;
      while (j < 12)
      {
            i = 300 + rand() % 500 + 1;//随机生成300-801之间的数字
            j++;
      }
      n++;
    }
}

void print(int i[])
{
    int n = 0;
    while (n < 3)
    {
      printf("第%d年:\n", n + 1);
      int j = 0;
      while (j < 12)
      {
            printf("%d", i);
            j++;
      }
      puts("\n");
      n++;
    }
}

void moth(int i[])
{
    int n = 0;
    double d = 0;
    while (n < 3)
    {
      int j = 0;
      while (j < 12)
      {
            d += i;
            j++;
      }
      n++;
    }
    printf("3年平局每个月支出%0.2lf元\n", d / 36);
}

void sss(int i[])
{
    int n = 0;
    while (n < 3)
    {
      double d = 0;
      int j = 0;
      while (j < 12)
      {
            d += i;
            j++;
      }
      printf("第%d年总支出是%0.lf元,平局每个月支出%0.2lf元\n", n + 1, d, d / 12);
      n++;
    }
}

void ssss(int i[])
{
    int j = 0;
    double t = 0;
    int k = 0;
    while (j < 12)
    {
      double d = 0;
      int n = 0;
      while (n < 3)
      {
            d += i;
            n++;
      }
      if (d > t)
      {
            t = d;
            k = n;
      }
      printf("平局3年%d月支出%0.2lf元\n", j + 1, d / 3);
      j++;
    }
    printf("3年中支出最多的月份是%d,平均%0.2lf元\n", k + 1, t / 3);
}

int main()
{
    int i;
    random(i);
    print(i);
    moth(i);
    sss(i);
    ssss(i);
    return 0;
}


3.函数指针
定义:int (*ps)(int ,int )

返回值类型 ( * 指针变量名) ([形参列表]);
首先我们来声明一个函数。
int del(int a, int b)
{
    return a* b;
}    把函数名替换成指针表达式是创建指向函数指针最简单的方式:
int (*ps)(int a, int b);    //声明函数指针,此时函数指针没有指向任何函数</span>这时,我们就已经完成了一个最简单的函数指针声明,其意义是:生命了一个函数指针,其指向的函数返回一个int值,带有两个int型参数。
接下来我们对函数指针进行初始化:
ps = del;               //使函数指针指向del函数这样就完成了函数指针的初始化。接下来,我么就可以通过此函数指针引用此函数。
ps = del; //将函数指针ps指向del函数
printf("%d",(*ps)(4, 5));//调用指针函数进行运算,也可以写成ps(4,5)不过(*ps)(4,5)是标准写法



roger 发表于 2021-1-12 21:56:57

开始难了,这里要慢一点学

玄之玄 发表于 2021-9-8 10:31:41

你的的代码中k = n; 错误
printf("3年中支出最多的月份是%d,平均%0.2lf元\n", k + 1, t / 3);输出是由问题,
n 表示的是年份,你应该是 k = j;

xiaoweiwb 发表于 2021-9-11 06:21:59

学习了,谢谢
页: [1]
查看完整版本: C语言学习 二维数组 指针数组 函数指针