关于常量指针的用法

一、指向常量的指针
 

例1

int main()
{
    int num =5;
    const int fun =100;
    int *pi;
    const int *pci;
    pi =#
    pci =&fun;
    printf("num  addr:%p  value :%d\n",&num ,num);
    printf("fun  addr:%p  value :%d\n",&fun ,fun);
    printf("pi   addr:%p  value :%p\n",&pi ,pi);
    printf("pci  addr:%p  value :%p\n",&pci ,pci);
    printf("pci  value :%d\n",*pci);        //只是读取整数的值,合法
    return 0;
}

结果输出

我们不能解引指向常量的指针并改变指针所引用的值,但是可以改变指针。

例2

int main()
{
    const int fun =100;
    const int *pci;
    pci =&fun;
    pci =4;     //此行不合法
    printf("pci  value :%d\n",*pci);    
    return 0;
}

指针可以改为指向另外一个整数常量或者普通整数

例3

#include <stdio.h>
int main()
{
    int num =8;
    int const a=10;
    const int *pci;
    const int *pci_1;
    pci =&num;//指向普通整数
    pci_1 =&a;//指向整数常量
    printf("pci  addr:%p  value :%p\n",&pci ,pci);
    printf("pci_1  addr:%p  value :%p\n",&pci_1 ,pci_1);
    printf("pci  value :%d\n",*pci);        
    printf("pci_1  value :%d\n",*pci_1);      
    return 0;
}

结果

总结:

1、指向整数常量的指针可以被修改指向不同的整数常量。

2、指向整数常量的指针可以被修改指向不同的非整数常量。

3、可以解引指向整数常量的指针读取数据。(例1的第五printf)

4、const int  *p  与  int  const  *p     是等价的,因人而异。

 

二、指向非常量的常量指针

1、p 必须被初始化为指向非常量变量。

2、p不能指向常量,因为数据不能被修改,所以导致报错。

3、p指向的数据可以被修改,因为指向的是变量。

4、一旦初始化把地址赋给p之后,不能继续赋新的值。(如例4)

例1

#include <stdio.h>
int main()
{
    int num =888;
    int *const p=&num;//p 必须被初始化为指向非常量变量
    printf("p  value :%d\n",*p);        
  
    return 0;
}

例2

#include <stdio.h>
int main()
{
    int num =888;
    int const a=666;
    int *const p=&num;//p 必须被初始化为指向非常量变量
    int *const p1=&a; //p 指向常量报错,不可以这样初始化
    printf("p  value :%d\n",*p);        
    printf("p1  value :%d\n",*p1);  
    return 0;
}

报错信息如下

 

解引操作:

例3

#include <stdio.h>
int main()
{
    int num =888;
    int *const p=&num;//p 必须被初始化为指向非常量变量
    printf("p  value :%d\n",*p);        
    *p=666;//无论p引用了什么,都可以解引p然后赋一个新值
    printf("p  value :%d\n",*p);        
    return 0;
}

例4

#include <stdio.h>
int main()
{
    int num =888;
    int ber =123;
    int *const p=&ber;//p 必须被初始化为指向非常量变量
    p=&num;//不能被重新赋值
     printf("p  value :%d\n",*p);        
   
    return 0;
}

三、指向常量的常量指针

这个用法用的很少。这种指针本身不能修改,指向的数据也不能通过TA来修改。

const int * const p=&num;

在第二部分的例子3的基础上加const。

#include <stdio.h>
int main()
{
    int num =888;
    int const a=666;
    int *const p=&num;//p 必须被初始化为指向非常量变量
    const int *const p1=&a; //在第二部分的例子3的基础上加const,指向常量的常量指针
    printf("p  value :%d\n",*p);        
    printf("p1  value :%d\n",*p1);  
    return 0;
}



   结果  p  value :  888
        p1  value : 666

 

四、总结

const(*号)左边放,指针变量指向常量

const(*号)右边放,指针常量指向变量

const(*号)两边放,指针常量指向常量

 

 

 

 

参考文献:《深入理解C指针》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值