指针和const

例一:
#include <stdio.h>

void fun( const  char **p){}

int main(int argc, char **argv)
{
        fun(argv);
        return 0;
}

编译会报错:fun()函数实参类型与形参类型不匹配。

char **p1;                // p1指向变量类型是char *
const char **p2;      // p2指向变量类型是const char *,在这里,const是类型的一部分。
故:p1和p2指向的类型不一样,不能把p1赋值给p2。

但编译器允许这样:
char *p1;
const char *p2;
p2 = p1;
也就是说当且仅当为一级指针的时候,编译器允许将char *类型的指针赋给const char *类型的指针。

当进入二级关系时,如下代码:
const char **pp;
char *p;
pp = &p; // 是错误的。pp类型是const char **,&p类型是char **。
假设上面这行代码是正确的,则如下代码:
const char a = 10;
*pp = &a;
*p = 20;    // 就把const char类型的变量a的值改变了

例二:
#include <stdio.h>

void fun(char *const*p){}

int main(int argc, char **argv)
{
        fun(argv);
        return 0;
}
编译则不会有错。

char **p1;                // p1指向变量类型是char *
char * const   *p2;      // p2指向变量类型是char *  const,在这里,const是一个限定符,而不是类型的一部分。
故:p1和p2指向的类型不一样(都是char *),所以可以把p1赋值给p2。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值