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语言学习 数组
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; //将函数指针ps指向del函数
printf("%d",(*ps)(4, 5)); //调用指针函数进行运算,也可以写成ps(4,5)不过(*ps)(4,5)是标准写法
|