const指针和指向指向const的指针

const关键字作用:

  1. const定义一个常量,这个常量再定义的时候必须进行初始化,否则以后没机会
#include <stdio.h>

int main(void)
{       
        const int i=0;

        i=10;

        printf("i=%d\n",i);

        return 0;
}

编译报错:变量 i 为只读
const.c: In function ‘main’:
const.c:7:3: error: assignment of read-only variable ‘i’
  i=10;

变量 i 是const定义,不能被单独复制,只能在初始化时赋值

  1. 实际上const定义的变量并不是一个真正的常量
#include <stdio.h>

int main(void)
{
        const int i=10;

        int *pt=&i;

        *pt = 20;

        printf("i=%d\n",i);

        return 0;
}

编译提示警告:
const.c: In function ‘main’:
const.c:7:10: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
  int *pt=&i;
          ^
运行结果
vain@ubuntu:~/dst$ ./a.out
i=20

const定义的变量不能普通赋值修改,可以通过指针来修改他的值

#include <stdio.h>

int main(void)
{
        const int i=3;

        char arr[i] = {'a','b','c'};

        printf("i=%d\n",i);

        return 0;
}

编译报错:字符数组的范围要用常量,i 为变量
const.c: In function ‘main’:
const.c:7:2: error: variable-sized object may not be initialized
  char arr[i] = {'a','b','c'};
  ^~~~
const.c:7:17: warning: excess elements in array initializer
  char arr[i] = {'a','b','c'};
                 ^~~
const.c:7:17: note: (near initialization for ‘arr’)
const.c:7:21: warning: excess elements in array initializer
  char arr[i] = {'a','b','c'};
                     ^~~
const.c:7:21: note: (near initialization for ‘arr’)
const.c:7:25: warning: excess elements in array initializer
  char arr[i] = {'a','b','c'};
                         ^~~
const.c:7:25: note: (near initialization for ‘arr’)

i 被const定义,本质上是变量 。

  1. const 和指针的用法
    const int *pt;
    int const *pt; :两者都是相同的,都代表pt指针可以指向任意对象,但是不能通过 pt 指针来修改指向对象。
#include <stdio.h>

int main(void)
{
        const int i=3;

        const int *pt = &i;

        *pt=10;

        printf("i=%d\n",i);

        return 0;
}

编译报错:提示指针 *pt 为只读变量,pt指针指向的内容不能修改。

const.c: In function ‘main’:
const.c:9:5: error: assignment of read-only location ‘*pt’
  *pt=10;
     ^
#include <stdio.h>

int main(void)
{
        const int i=3;
        int j = 100;
        const int *pt = &i;
        pt = &j;


        printf("i=%d\n",i);
        printf("*pt = %d\n",*pt);

        return 0;
}

运行结果 : *pt指针的值不能修改,pt可以指向其他位置
i=3
*pt = 100

  1. int *const pt : pt 指针必能指向其他位置,但是可以通过 pt 指针修改指向位置的值
#include <stdio.h>

int main(void)
{
        const int i=3;
        int j = 100;
        int *const pt = &i;
        pt = &j;


        printf("i=%d\n",i);
        printf("*pt = %d\n",*pt);

        return 0;
}

编译报错:编译报错 pt 被const定义,pt指向的地址不能改变,*pt的值可以改变
const.c: In function ‘main’:
const.c:7:18: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
  int *const pt = &i;
                  ^
const.c:8:5: error: assignment of read-only variable ‘pt’
  pt = &j;
     ^
#include <stdio.h>

int main(void)
{
        const int i=3;
        int j = 100;
        int *const pt = &i;

        *pt = 10;

        printf("i=%d\n",i);
        return 0;
}

运行结果:
i=10

  1. const定义函数形参
#include <stdio.h>

int add(const int *pt1,const int *pt2)
{
        return *pt1+*pt2;
}

int main(void)
{
        int i=3;
        int j = 100;
        int sum;

        sum = add(&i,&j);

        printf("sum = %d\n",sum);
        return 0;
}

运行结果: 
sum = 103

const修饰的形参也是不能显性修改

#include <stdio.h>

int add(const int *pt1,const int *pt2)
{
        *pt1+=10;
        *pt2+=20;
        return *pt1+*pt2;
}

int main(void)
{
        int i=3;
        int j = 100;
        int sum;

        sum = add(&i,&j);

        printf("sum = %d\n",sum);
        return 0;
}

编译报错:
const.c: In function ‘add’:
const.c:5:6: error: assignment of read-only location ‘*pt1’
  *pt1+=10;
      ^~
const.c:6:6: error: assignment of read-only location ‘*pt2’
  *pt2+=20;
      ^~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值