643757107 发表于 2025-2-25 10:18

返回指向常量的指针

const int *abc(void)
{
    // 函数体
}返回类型:const int*

这是一个指向 const int 的指针,表示指针指向的整数值是常量,不能通过该指针修改。

函数名:abc

参数列表:void

表示该函数不接受任何参数。

函数体:{}

函数体为空,这是一个不完整的实现。


函数的作用
这个函数的目的是返回一个指向 const int 的指针。通常,这种函数会返回一个指向常量数据的指针,调用者可以通过该指针读取数据,但不能修改数据。

const int *abc(void)
{
    static int value = 42;// 静态变量,确保函数返回后指针仍然有效
    return &value;          // 返回指向 value 的指针
}static int value = 42;:

使用 static 关键字确保 value 的生命周期延长到程序结束,避免返回局部变量的地址(局部变量在函数结束后会被销毁,导致悬空指针)。

return &value;:

返回 value 的地址,但由于返回类型是 const int*,调用者不能通过该指针修改 value 的值。


#include <stdio.h>

const int *abc(void)
{
    static int value = 42;
    return &value;
}

int main()
{
    const int *ptr = abc();// 获取指向常量整数的指针
    printf("Value: %d\n", *ptr);// 输出: Value: 42

    // *ptr = 100;// 错误!不能通过 const int* 修改值
    return 0;
}const int *ptr = abc();:

调用 abc() 函数,返回一个指向 const int 的指针,并将其赋值给 ptr。

printf("Value: %d\n", *ptr);:

通过指针读取值并输出。

*ptr = 100;:

如果取消注释,会导致编译错误,因为 ptr 是一个指向常量的指针,不能用于修改值。


643757107 发表于 2025-2-25 10:18

返回局部变量的地址是危险的:
如果函数返回局部变量的地址,会导致未定义行为,因为局部变量在函数结束后会被销毁。例如:
const int *abc(void)
{
    int value = 42;// 局部变量
    return &value;    // 错误!返回局部变量的地址
}解决方法:

使用 static 关键字延长变量的生命周期。

使用动态内存分配(如 malloc),但需要调用者负责释放内存。

const 的含义:

const int* 表示指针指向的值是常量,不能通过该指针修改。

如果需要指针本身是常量(即指针不能被修改),可以写成 int* const。

如果指针和指向的值都是常量,可以写成 const int* const。

函数体不能为空:
如果函数体为空,编译器可能会发出警告或错误。确保函数有实际的实现。

643757107 发表于 2025-2-25 10:19

const int *abc(void) 是一个合法的函数声明,表示该函数返回一个指向 const int 的指针。

函数的作用通常是返回一个指向常量数据的指针,调用者可以读取但不能修改数据。

注意避免返回局部变量的地址,否则会导致未定义行为。

643757107 发表于 2025-2-25 10:29

这玩意儿不复习复习,就弄错了。

643757107 发表于 2025-2-25 10:35


需要注意的是,这种变量一定要在创建的时候赋值,负责就是报错。

jiekou001 发表于 2025-2-26 15:21

原来还可以这么用。

wanduzi 发表于 2025-2-26 18:55

遇到指针就容易蒙蔽,有时候用.,有时候用-> 还有*,还有&

xixi2017 发表于 2025-2-28 14:47

看完之后提高了基础知识。

初级工程渣 发表于 2025-3-26 15:00

这个 const int *abc(void) 函数的作用是返回一个指向 const int 的指针,使得调用者可以读取返回值但不能修改它。
页: [1]
查看完整版本: 返回指向常量的指针