zoukankan      html  css  js  c++  java
  • 指针知识梳理6-const与指针

    const 定义的变量为仅仅读变量。在语法层面上通过这个变量去改动内存是不同意的。

    可是对于下面代码。就有非常多人绕了:

    const int  *p1;  //p1能变。*p1不能变

    int const  *p2;  //p2能变。*p2不能变

    int *const  p3;  //p3不能变。*p2能变

    我们通过代码来验证说明这三种写法:

    </pre><p></p><pre>

    #include <stdio.h>
    int main()
    {
    	int a;
    	int b;
    	const int *p1 = &a;//初始化
    	int const *p2 = &a;//初始化
    	int *const p3 = &a;//初始化
    	
    	a = 1; //说明a相关的内存可读写
    	
    	// p1 p2 是一样效果。
    	p1 = &b; //编译通过,说明p1本身能够写。
    	*p1 = 1; //编译不通过,说明语法上不同意 通过p1 去写a 的内存。
    
    	p2 = &b; //编译通过,说明p2本身能够写。
    	*p2 = 1; //编译不通过, 说明语法上不同意 通过p2 去写a 的内存。
    	//注意以上a 本身的内存是可读写的,仅仅只是通过p1 p2没有权限去改动。
    	
    	p3 = &b; //编译不通过,说明p3本身不能够写。
    	*p3 = 1; //编译通过。说明语法上 能够通过p3去改动a的内存。
    	
    	return 0;
    }

    对于上面记忆有个小技巧,当 const 在*的左边的时候,修饰的是 *p ,则 *p 是不能改变的。也就是说所谓不能改变p指向的内存。

    当const 在*右边的时候,修饰的是 p ,p不能改变。

    const 与指针结合 用来提高程序猿写代码的严谨性:

    比方下面代码 

    void  strcpy(char *src ,const char *dest);

    这个strcpy函数期望做的是 把dest指向的内存处的字符串复制到 src指向的内存处。

    那么事实上 这样的函数接口也可以全然实现,可是。假设在实现strcpy的时候,在函数中不小心改动了 dest指向的内存,那么就改函数接口的本意有悖,由于 依照正常逻辑,你拷贝东西的时候不会改变原来的东西。

    比方不小心写了下面代码

    void  strcpy(char *dest ,char *src)
    {
        *src = 'a';
        //其它代码
    }
    这样语法上没问题。可是执行就有问题了。

    假设接口设计成 const char *src

    void  strcpy(char *dest ,const char *src)
    {
        *src = 'a'; //当写出这种代码的时候编译就会报错,提高了代码的安全性。

    //其它代码 }




  • 相关阅读:
    BIO、NIO、AIO有什么区别?
    java中IO流有哪些?
    List、Map、Set 三个接口,存取元素时,各有什么特点?
    Vector、ArrayList、LinkedList 的存储性能和特性?
    Java.util.Map的常用实现类有哪些?
    Java自学指南六、查一手资料
    虚拟机中Lvs配置
    m2014-software->Word2010发布博客文章至Cnblogs
    m2014-c->c模拟java的hashmap容器类
    m2014_c->c语言容器类工具列
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5088823.html
Copyright © 2011-2022 走看看