嵌入式第十七天——C语言指针3

「C++ 40 周年」主题征文大赛(有机会与C++之父现场交流!) 10w+人浏览 377人参与

一、指针函数:返回值是指针的函数

指针函数的核心是函数,返回值类型是一个指针。语法格式如下:

返回值类型* 函数名(参数列表);

关键注意点:

(1)不能返回函数内局部变量的地址,因为局部变量在函数执行完毕后会被销毁。

(2)可以返回全局变量、静态局部变量或堆内存(malloc 分配)的地址。

代码示例:

#include <stdio.h>
#include <stdlib.h>

int* createArray(int n) {
    int* arr = (int*)malloc(n * sizeof(int));
    for (int i = 0; i < n; i++) {
        arr[i] = i * 2;
    }
    return arr;
}

int main() {
    int* p = createArray(5);
    for (int i = 0; i < 5; i++) {
        printf("%d ", p[i]);
    }
    free(p);
    return 0;
}

二、函数指针:指向函数的指针

函数指针的核心是指针,指向函数的入口地址。语法格式如下:

返回值类型 (*指针变量名)(参数列表);

核心用途:

(1)实现函数回调(如 qsort 排序)。

(2)模拟多态行为。

(3)简化函数调用接口。

代码示例:

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int mul(int a, int b) {
    return a * b;
}

int main() {
    int (*funcPtr)(int, int);
    funcPtr = add;
    printf("3+5=%d\n", funcPtr(3, 5));
    funcPtr = mul;
    printf("3*5=%d\n", (*funcPtr)(3, 5));
    return 0;
}

三、二级指针:指向指针的指针

二级指针指向一级指针变量的内存地址。语法格式如下:

数据类型** 二级指针名;

核心用途:

(1)在函数中修改一级指针的值。

(2)处理指针数组(如字符串数组 char* arr[])。

代码示例:

#include <stdio.h>

void assignValue(int** pp) {
    *pp = (int*)malloc(sizeof(int));
    **pp = 100;
}

int main() {
    int* p = NULL;
    int** pp = &p;
    assignValue(pp);
    printf("p指向的值:%d\n", *p);
    printf("p的地址:%p\n", p);
    printf("pp存储的地址(即p的地址):%p\n", pp);
    free(p);
    return 0;
}

四、const 指针:限制指针或指向内容的修改

const 修饰指针时,区分修饰指针本身还是指向的内容。

1、修饰指向的内容(内容不可改)

const int* p;

(1)不能通过指针修改目标变量的值。

(2)指针本身可以重新指向其他变量。

2、修饰指针本身(指针不可改)

int* const p = &a;

1、指针本身不能重新指向其他变量。

2、可以通过指针修改目标变量的值。

3、必须初始化。

3、同时修饰指针和内容(都不可改)

const int* const p = &a;

1、指针和指向的内容均不可修改。

2、必须初始化。

总结

概念本质语法格式核心用途
指针函数函数返回值类型* 函数名(参数)返回指针(如堆内存地址)
函数指针指针返回值 (*指针名)(参数)函数回调、模拟多态
二级指针指针数据类型** 指针名修改一级指针、处理指针数组
const 指针指针根据 const 位置决定限制对象保护数据或指针不被意外修改
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值