const关键字的用法

1 const修饰变量;

* 在C语言中const修饰的变量是只读的,其本质还是变量,所以可以使用指针将其变量的值改变。

* const修饰的变量会在内存占用空间

* 本质上const只对编译器有用,在运行时无用

实例:

int main(int argc, char *argv[])
{
   const int va=10;
           printf("va = %d\n",va);
   int* p=&va;
   *p=100;
   printf("new va =%d\n",va);
    return 0;
}
运行结果:

va=10;

new va=100;

2 const修饰数组

 * 在C语言中const修饰的数组是只读的

 * const修饰的数组空间不可被改变

实例:

int main(int argc, char *argv[])
{
   const int array[]={1,2,3,4,5,6};
           int *p=array;
  for(int i=0;i<5;i++)
      p[i]=5-i;
  for(int j=0;j<5;j++)
   printf("new array =%d\n",array[j]);
    return 0;
}

输出:5 4 3 2 1

3 const修饰的指针

* const int* p;       //p可变,p指向的内容不可变

* int const* p;       //p可变,p指向的内容不可变

* int*const p;       //p不可变,p指向的内容可变

* const int*const p; //pp指向的内容都不可变

口诀:左数右指---->当const出现在*的左边,则指针指向的数据不可以被改变,当const出现在*的右边,则指针指本身不可改变,(即指针指向的地址不可以被改变);

实例:

T1 const int* p;  

int main(int argc, char *argv[])
{
    int v_a=10;
    int v_b=100;
    const int *p=&v_a;
    *p=100;
    printf("v_a=%d\n",v_a);
    return 0;
}
这里试图用*p改变p所指向地址的值,则编译无法通过;

int main(int argc, char *argv[])
{
    int v_a=10;
    int v_b=100;
    const int *p=&v_a;

    printf("*p=%d\n",*p);
    p=&v_b;
    printf("*p=%d\n",*p);
    return 0;
}
这里先将const修饰的指针指向v_a,然后又将const修饰的指针指向v_b合法,输出*p=10,*p=100;

T2 int const* p 其功能和const int *p一样;

实例:

int main(int argc, char *argv[])
{
    int v_a=10;
    int v_b=100;
   int  const *p=&v_a;

    printf("*p=%d\n",*p);
    p=&v_b;
    printf("*p=%d\n",*p);
    return 0;
}
这里先将const修饰的指针指向v_a,然后又将const修饰的指针指向v_b合法,输出*p=10,*p=100;
int main(int argc, char *argv[])
{
    int v_a=10;
    int v_b=100;
   int  const *p=&v_a;
    printf("*p=%d\n",*p);
    *p=100;
    return 0;
}
这里试图用*p改变p所指向地址的值,则编译无法通过;

T3 int*const p,const在*的右边,所以本身(指向的地址不可以被改变),但其指向的值可以改变
实例:

int main(int argc, char *argv[])
{
    int v_a=10;
    int v_b=100;
    int*  const p=&v_a;
   // printf("*p=%d\n",*p);
    *p=100;
    printf("*p=%d\n",*p);
    return 0;
}
指向先指向v_a=10,后面改变了指针指向地址的值为100,是合法的;输出100;

实例:

int main(int argc, char *argv[])
{
    int v_a=10;
    int v_b=100;
    int*  const p=&v_a;
    printf("*p=%d\n",*p);
    p=&v_b;
    printf("*p=%d\n",*p);
    return 0;
}
这里试图改变指针指向的地址,编译器无法通过;

T4 

const int*const p; //pp指向的内容都不可变

实例:

int main(int argc, char *argv[])
{
    int v_a=10;
    int v_b=100;
    const int*  const p=&v_a;
    printf("*p=%d\n",*p);
    *p=v_b;
    return 0;
}
试图修改p指向的地址的值不合法,编译器不通过。

int main(int argc, char *argv[])
{
    int v_a=10;
    int v_b=100;
    const int*  const p=&v_a;
    printf("*p=%d\n",*p);
    p=&v_b;
    return 0;
}


试图改变p指向的地址,不合法,编译器直接不通过。

4 const修饰函数参数和返回值

const修饰函数参数表示在函数体内不希望改变参数的值

*const修饰函数返回值表示返回值不可改变,多用于返回指针的情形





 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值