c语言基础:多级指针、函数的基本用法、预处理#define

多级指针

二级指针变量的说明形式如下。

数据类型 **指针名

c 复制代码
int main() {
    int a =10;
    int *p = &a;
    int **pp = &p;
    printf("%d\n", **pp);
    return 0;
}

多级指针+1,在64位系统下移动8个字节

多级指针的运用

c 复制代码
int main() {
    int a[] = {1, 2, 3, 4, 5};
    int *p[5];
    int n = sizeof(a) / sizeof(int);
    int i;
    int **q;
    for (i = 0; i < n; i++) {
        p[i] = &a[i];
    }
    q = p;
    printf("%d %d %d",a[1],*p[1],*q[1]);
    return 0;
}

多级指针和指针数组

c 复制代码
int main() {
    char *a[5] = {"beijin", "tianjin", "shanghai", "sichuan", "shanxi"};
    char **b = a;
    printf("%s %s\n",a[3],*b);//或者b[1]、*(b + 1)
    return 0;
}

函数的基本用法

为了完成特定功能的代码模块,使其代码独立,通常要求有返回值,也可以是空置。

数据类型 函数名称 (参数){ return 0; }

c 复制代码
int main() {
    return 0;
}

判断输入数字大小写

c 复制代码
int get_max (int a,int b) {
    if(a > b) {
        return a;
    }
    return b;
}
int main() {
    int i,j;
    scanf("%d %d",&i,&j);
    int ret = get_max(i,j);
    printf("%d\n",ret);
    return 0;

}

一维数组在函数间传参

c 复制代码
int fun_sum(int *data,int n) {
    int i;
    int sum = 0;
    for(i = 0;i < n;i++) {
            sum = data[i] + sum;
    }
    return sum;
}

int main() {
    int a[] = {1, 2, 3, 4, 5};
    int sum = 0;
    sum = fun_sum(a, sizeof(a) / sizeof(int));
    printf("%d\n", sum);

    return 0;
}

什么是指针函数

特征是返回值为指针int *fun(int x, int y)因为()的优先级最高,所以fun与后面的括号结合,是函数名,调用它以后能得到一个int类型的指针。

指针函数函数的返回值为指针,

一般形式为 数据类型 *函数名称 (参数说明)

递归函数

  • 递推阶段:从原问题出发,按递归公式递推从未知到已知,最终达到递归终止条件。
  • 回归阶段:按递归终止条件求出结果,逆向逐步代入递归公式,回归到原问题求解
c 复制代码
int fac(int n);

int main() {
    int n;

    scanf("%d", &n);
    int ret = fac(n);
    printf("%d != %d\n", n,ret);
  return 0;
}
 int fac(int n) {

    if (n==1) return 1;
    return n * fac(n-1);
 }

预处理指令#define

  • #define叫做宏定义语法格式#define 名字 值
  • 结尾没有分号
  • 和#include一样,在预处理阶段执行,文本替换
  • 值可以是数字、表达式、代码语句等
  • 宏定义的好处、便于程序的阅读和维护 C
arduino 复制代码
#include "stdio.h"
#define N 10
#define M (3+2)
#define S 3+2



int main(int argc, char *argv[]) {
  int a[N] = {0};//创建一个大小为10的数组
  a[0] = 100;
  printf("%d\n", a[0]);//打印100
  printf("%d\n", M * 2);//(3+2)* 2 = 10
  printf("%d\n", S * 2);// 3 + 2 * 2 = 7
  return 0;
}
相关推荐
苏渡苇5 分钟前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
long31617 分钟前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
rannn_11144 分钟前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
短剑重铸之日1 小时前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
Dragon Wu2 小时前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
一个有梦有戏的人2 小时前
Python3基础:进阶基础,筑牢编程底层能力
后端·python
爬山算法2 小时前
Hibernate(88)如何在负载测试中使用Hibernate?
java·后端·hibernate
独断万古他化3 小时前
【Spring 原理】Bean 的作用域与生命周期
java·后端·spring
我爱加班、、3 小时前
Websocket能携带token过去后端吗
前端·后端·websocket
一 乐3 小时前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端