1.条件编译
定义 xxx.h头文件时
#ifndef _XXX_H
#define _XXX_H
头文件的内容
#endif
防止重复定义
2.随机数
#include <stdlib.h>
#include <time.h>
srand((unsigned int)time(NULL));//设置随机时间种子
int a;
a = rand() % 900 + 100; //设置的随机数在100到1000之间。
3. visual studio 2019的scanf
使用scanf出现问题时,我们可以在最开始,记得是最开始定义一个
#define _CRT_SECURE_NO_WARNINGS
这样他就不会报错了。
4.函数指针
函数的指针指的是一个函数在编译时被分配的入口地址,这个地址被称为该函数的指针。可以用一个指针变量存放函数的指针,从而让该指针变量指向一个函数。然后,可以通过指针变量调用该函数。指向函数的指针变量与前面介绍的指针变量不同
指向函数的指针变量的定义格式:
函数类型 (*指针变量)(形参列表);
例子1
#include <stdio.h>
int fun(char tring[]) /*函数fun统计字符数组tring中英文字母的个数*/
{
int z = 0, k;
for (k = 0; tring[k] != '\0'; k++)
{
if ('a' <= tring[k] && tring[k] <= 'z' || 'A' <= tring[k] && tring[k] <= 'Z')
{
z++;
}
}
return (z);
}
int main()
{
int (*pf)(char tring[]); /*定义pf为函数指针变量,指向有1个数组为参数的函数*/
char tring[80];
int n;
pf = fun; /*pf指向函数fun*/
scanf("%s", tring); /*从键盘输入一串字符(小于80个)存放在数组tring中*/
n = (*pf)(tring); /*调用函数fun,在”pf = fun;“前提下,(*pf)等价于fun*/
printf("%d\n", n);
return 0;
}
例子2
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
float f1(float x) /*定义函数f1*/
{
float f;
f = x;
return f;
}
float f2(float x) /*定义函数f2*/
{
float f;
f = 2 * pow(x, 2) - 1;
return f;
}
float f3(float x) /*定义函数f3*/
{
float f;
f = 4 * pow(x, 3) - 3 * x;
return f;
}
float f4(float x) /*定义函数f4*/
{
float f;
f = 8 * pow(x, 4) - 8 * pow(x, 2) + 1;
return f;
}
void cheby(float (*f)(float)) /*定义函数cheby*/
{
float x, result;
printf("input x:\t");
scanf("%f", &x);
result = (*f)(x); /*调用cheby时,f指向哪个函数,(*f)(x)就是调用哪个函数*/
printf("reslut = %f\n", result);
}
int main()
{
int n;
printf("input n(n的范围为1~4):");
scanf("%d", &n);
if (n == 1) cheby(f1); /*f1的入口地址传给函数cheby的形参f*/
if (n == 2) cheby(f2); /*f2的入口地址传给函数cheby的形参f*/
if (n == 3) cheby(f3); /*f3的入口地址传给函数cheby的形参f*/
if (n == 4) cheby(f4); /*f4的入口地址传给函数cheby的形参f*/
}
5. 返回指针值的函数
调用一个有返回值的函数,可以返回一个int型或float型或char型的值。实际上调用一个有返回值的函数也可以返回一个指针类型的值,即返回一个地址。
格式:
函数类型 * 函数名(形参表列)
例子
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int* find(int n); /*函数声明,该函数find返回指针值*/
int main()
{
int k, * p;
printf("请输入要查找的一个正整数:");
scanf("%d", &k);
p = find(k); /*p里面存放着的地址就是那个值*/
if (p == NULL)
{
printf("%d在数组中不存在。\n", k);
}
else
{
printf("在数组中,正整数%d第一次出现的地址是:%d。\n", k, p);
}
return 0;
}
int* find(int n) /*定义返回指针值的函数find*/
{
int a[20] = { 12,24,33,47,18,67,57,84,96,10,13,47,33,64,15,76,17,88,33,20 };
int i, * pa;
pa = a;
for (i = 0; i < 20; i++, pa++)
{
if (*pa == n)
{
return pa; /*返回查找到的正整数的地址*/
}
}
return NULL; /*若循环结束没有找到,返回空指针*/
}