再学C语言39:指针操作(2)

在编写处理int这样的基本类型的函数时,可以向函数传递int数值,也可以传递指向int的指针

通常直接传递int数值,只有需要在函数中修改该值时,才传递指针

对于处理数组的函数,只能传递指针,这样能使程序效率更高

如果通过值向函数传递数组,函数中必须分配足够存放一份原数组的拷贝的存储空间,然后把原数组的所有数据复制到这个新数组中

如果简单地把数组的地址传递给函数,让函数直接读写原数组,程序的效率会更高


传递指针与传递数值相比,会引入新问题:

通常C传递数据的值,其原因是为了保证原始数据的完整性;函数使用原始数据的一份拷贝,不会出现意外修改原始数据的情况出现

由于处理数组的函数直接对原始数据进行操作,使其能够修改原数组

在很多应用场景下,这种特性正式所需要的;然而也存在一些应用场景,并不希望原数组被修改


一、对形式参量使用const

ANSI C中,如果设计意图是不希望函数改变数组的内容,则在函数原型和定义的形式参量声明中使用关键字const

关键字const告知编译器:函数应当把指针所指向的数组作为包含常量数据的数组对待;如果意外地对数组元素进行了修改,编译器将会报错

这样使用const并不要求原始数组是固定不变的,只是说明函数在处理数组时,应当把数组当做是固定不变的

示例代码:

#include <stdio.h>

#define SIZE 10

void show_arr(const int arr[], int n);
void mult_arr(int arr[], int m, int f);

int main(void)
{
    int arr[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    printf("原始数组:\n");
    show_arr(arr, SIZE);
    mult_arr(arr, SIZE, 10);
    printf("新数组:\n");
    show_arr(arr, SIZE);

    return 0;
}

void show_arr(const int arr[], int n)
{
    int i;
    for(i = 0; i < n; i++)
    {
        printf("%4d", arr[i]);
    }
    printf("\n");
}

void mult_arr(int arr[], int n, int f)
{
    int i;
    for(i = 0; i < n; i++)
    {
        arr[i] *= f;
    }
}

运行结果:

1ffb060b5930482098bdc10e4b2cb707.png

二、const的使用

使用const创建符号常量

const double PI = 3.14; // 也可以用#define指令实现
#define PI 3.14

使用const创建数组常量、指针常量及指向常量的指针

const int array[5] = {1, 2, 3, 4, 5}; // 数组常量

指向常量的指针:

int array[5] = {1, 2, 3, 4, 5};
const int * p = array; // p指向数组开始处
                       // 指向常量的指针不能用于修改数值

无论是采用数组符号还是指针符号,都不能使用指向常量的指针修改所指向数据的值

通常把指向常量的指针用作函数参量,以表明函数不会用该指针修改数据,如

void show_arr(const int * arr, int n);

将常量或非常量的数据的地址赋给指向常量的指针时合法的;只有非常量数据的地址才可以赋给普通的指针

在函数参量定义中使用const,不仅可以保护数据,而且使函数可以使用声明为const的数组

const用于声明并初始化指针,可以保证指针不会指向别处

int array[5] = {1, 2, 3, 4, 5};
int * const p = array; // p指向数组开始处
                       // 可以用于修改数据,但只能指向最初赋给其的地址

可用用两个const创建指针,该指针既不可以更改所指向的地址,也不可以修改所指向地址的数据:

int array[5] = {1, 2, 3, 4, 5};
const int * const p = array;

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forster-C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值