查看: 517|回复: 1

[原创图文] C语言学习 二维数组 指针数组 函数指针

[复制链接]

34

主题

43

帖子

3

精华

解密专家

Rank: 16

学币
357
荣耀
0
rank
0
违规
0
发表于 2021-1-11 17:04:48 | 显示全部楼层 |阅读模式
1.指针数组

指针数组:char *p[20]={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[10] ;
在堆内申请一个数组:int *i=(int*)malloc(sizeof(int)*10)
-
在栈内申请一个指针数组:int *i[10] ;
在堆内申请一个指针数组:int **i=(int**)malloc(sizeof(int*)*10)

2.二维数组

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

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
    srand((unsigned)time(0));
    int i[3][12];
    int n = 0;
    while (n < 3)
    {
        int j = 0;
        while (j < 12)
        {
            i[n][j] = 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[n][j]);
            j++;
        }
        puts("\n");
        n++;
    }
    //统计三年中,36个月每月平局支出费用
    n = 0;
    double d = 0;
    while (n < 3)
    {
        int j = 0;
        while (j < 12)
        {
            d += i[n][j];
            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[n][j];
            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][j];
            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[][12])
{
    srand((unsigned)time(0));
    int n = 0;
    while (n < 3)
    {
        int j = 0;
        while (j < 12)
        {
            i[n][j] = 300 + rand() % 500 + 1;//随机生成300-801之间的数字
            j++;
        }
        n++;
    }
}

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

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

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

void ssss(int i[][12])
{
    int j = 0;
    double t = 0;
    int k = 0;
    while (j < 12)
    {
        double d = 0;
        int n = 0;
        while (n < 3)
        {
            d += i[n][j];
            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[3][12];
    random(i);
    print(i);
    moth(i);
    sss(i);
    ssss(i);
    return 0;
}

C语言学习 数组

C语言学习 数组


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)是标准写法



温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
学逆向论坛-免费的逆向学习论坛
发表于 2021-1-12 21:56:57 | 显示全部楼层
开始难了,这里要慢一点学
论坛交流群:672619046
微信扫一扫即可使用手机论坛
快速回复 返回顶部 返回列表