Loading

const和指针

前言

在C语言中,const配合指针使用是常有的。但使用的时候很容易出错,所以记录必须弄清楚原理性的东西。所以记录一下学习过程...

一、const的限定

指针是const

表示一旦得到了某一个变量的地址,不能再指向其他变量。换句话说:这个指针是一个常量,而常量是不能变的。

举例代码:

#include <stdio.h>

int main(void)
{
    int a = 60;
    int *const p_a = &a;
    printf("%d\n", *p_a);
    p_a++;

    return 0;
}

IDE报错提示:表达式必须是可修改的左值

所指是const

表示不能通过这个指针去修改那个变量(但并不能使得那个变量成为const)。换句话说:仅限定不能通过这个指针通过间接访问去修改所指的地址的值,所指地址的值自己可以改变,但对于指针本身是没有限制的,指针可以指向别的地址。

代码举例1:

#include <stdio.h>

int main(void)
{
  int a = 60;
  const int *p_a = &a;
  *p_a = 16;   

  return 0;
}

IDE报错提示:表达式必须是可修改的左值

代码举例2:

#include <stdio.h>

int main(void)
{
    int a = 60;
    const int *p_a = &a;
    printf("%d\n", *p_a);

    a = 16;
    printf("%d\n", *p_a);

    int b = 30;
    p_a = &b;
    printf("%d\n", *p_a);

    return 0;
}

运行结果:

二、const结合指针的优势

当要传递的参数的类型比地址还大的时候,常用的手段是:把一个非const的值转换成const,这种手段的优势是既能用比较少的字节数传递值给参数,又能避免函数对外面的变量的修改。

函数对于参数的处理方式:对于传递值进来的,先复制一份。如何这个传递值很大呢(比如结构体),复制所需要的时间就会变长。对于传递地址进来的,直接操作地址,速度很快。直接把结构体的指针传进去不就可以了吗? 但是我们要求函数不能对结构体的值进行修改,所以我们要对结构体指针要加以限定const,这样处理既可以加快处理速度,也能防止误修改结构体的值。

posted @ 2022-12-12 15:37  eiSouthBoy  阅读(136)  评论(0)    收藏  举报