关于C/C++ const变量 const指针 以及C++ 引用变量的解析

简介:  关于C/C++ const变量 const指针 以及C++ 引用变量的解析    首先我们知道const表示一个不能更改的值,在程序中往往使用这种属性来保证安全,但是这种操作在C和C++中却不同  我测试中C++不能用MEMCPY进行更改但是C却可以  其中我们常见的  const int a = 10;一个常量,不能更改其a的值  const int *p1;一个指针但是他的返回值是const int类型  如我们可以  p = &a;  int* const p;一个指针,这个指针在整个生命周期中不能指向其他位置。
 关于C/C++ const变量 const指针 以及C++ 引用变量的解析
 
 首先我们知道const表示一个不能更改的值,在程序中往往使用这种属性来保证安全,但是这种操作在C和C++中却不同
 我测试中C++不能用MEMCPY进行更改但是C却可以
 其中我们常见的
 const int a = 10;一个常量,不能更改其a的值
 const int *p1;一个指针但是他的返回值是const int类型
 如我们可以
 p = &a;
 int* const p;一个指针,这个指针在整个生命周期中不能指向其他位置。
 const int* const p;一个指针,这个指针在整个生命周期中不能指向其他位置,并且返回为const int类型
  我们在函数中也经常使用const
 const int* mul(const int *data,int step)
 const int *data:*data指向的值在函数中不能更改
 const int* mul:函数的返回值为一个const int类型
 
 另外C++中包含一个引用变量概念
 如
 const int a = 10;
 const int & b =a;
 这里&不是取地址,而是他是一个引用变量,b和a完全相同,不是拷贝,而是同样的类型同样的指针
 如果要用CONST描述就是
 const int* const b 和 &a相似
 b指针在生命周期中不能更改。也就是说int a=5; int &b=a;那么b就不能在引用其他变量了。而指针不加int* const的情况下是可以的
但是如果int c=10; b=c; 那么a和引用b都会变为10,也就是说引用是一个别名,对他的复制最终会影响他指向变量的值,因为他们的内存
区域是一块。
!!引用只能被初始化,并且必须初始化。

引用和指针区别
1、引用不能为空
2、new分配内存时只能返回给指针不能给引用
3、指针可以重新被赋值改变指针的地址,引用必须初始化初始化后不能再次改变其引用的对象。
4、当函数返回为按值后  主函数接收为引用则这个副本对象会被引用的生命周期更长然后析构,但是指针则是直接析构。
这一点过后讲述

 下面是一个演示程序
 
  1 /*************************************************************************
  2   > File Name: quotevar.cpp
  3   > Author: gaopeng
  4   > Mail: gaopp_200217@163.com 
  5   > Created Time: Fri 27 May 2016 07:47:34 AM CST
  6  ************************************************************************/
  7 
  8 #include
  9 #include
 10 using namespace std;
 11 
 12 
 13 
 14 int main(void)
 15 {
 16     const int a = 10;
 17     const int & b =a;
 18     const int* const p = &a;
 19     const int *p1 = &a;
 20     cout << a <<endl;
 21     cout << b <<endl;
 22     cout << *p <<endl;
 23     cout << &a <<endl;
 24     cout << &b <<endl;
 25     cout << p  <<endl;
 26     cout << p1  <<endl;
 27 
 28     const int c = 20;
 29     p1 = &c; //true p1 is a nomarl pointer but *p1 is a const value
 30     //b = 30;    error a is const value b also is a const value
 31     //a = 30;    error a is const value
 32     //p = &c;    error p is a const pointer
 33     cout << &b  <<endl;
 34     cout << &c  <<endl;
 35     cout << p1  <<endl;
 36     // --part 2 memcpy also cant't change const int a's value
 37     int d = 10;
 38     int *e = &d;
 39     char j = 'A';
 40     void *p2;
 41     void *p3;
 42     const void *p4 = (const void *)(&j);
 43     p2 = (void *)(p);
 44     p3 = (void *)(e);
 45     if ( p2 == memcpy(p2,p4,1))
 46     {
 47         cout << "memcpy p2 is finsh!"<<endl;
 48     }
 49 
 50     if (p3 == memcpy(p3,p4,1))
 51     {
 52         cout << "memcpy p3 is finsh!"<<endl;
 53     }
 54 
 55     cout << a <<endl;
 56     cout << &a <<endl;
 57     cout << d <<endl;
 58     cout << &d <<endl;
 59     cout << p2 <<endl;
 60     cout << p3 <<endl;
 61 }  
 
 返回值为
10
10
10
0x7ffd421b4ffc
0x7ffd421b4ffc
0x7ffd421b4ffc
0x7ffd421b4ffc
0x7ffd421b4ffc
0x7ffd421b5000
0x7ffd421b5000
memcpy p2 is finsh!
memcpy p3 is finsh!
10
0x7ffd421b4ffc
65
0x7ffd421b5004
0x7ffd421b4ffc
0x7ffd421b5004
使用的g++
可以看到完全的a和b有同样值有同样的地址,同时const 变量memcpy不能修改他的值,而普通的变量却可以。
但是这个结论不适用于C
使用gcc
10
10
10
0x7ffc9a13a2bc
0x7ffc9a13a2bc
0x7ffc9a13a2bc
0x7ffc9a13a2bc
0x7ffc9a13a2bc
0x7ffc9a13a2c0
0x7ffc9a13a2c0
memcpy p2 is finsh!
memcpy p3 is finsh!
65
0x7ffc9a13a2bc
65
0x7ffc9a13a2c4
0x7ffc9a13a2bc

可以看到memcpy更改了const变量的值,这应该来说是不安全,申明const就是要说明不能更改。

c程序如下:
#include
#include
#include

int main(void)
{
        const int a = 10;
        const int* const b =&a;
        const int* const p = &a;
        const int *p1 = &a;
        printf("%d\n",a);
        printf("%d\n",*b);
        printf("%d\n",*p);
        printf("%p\n",&a);
        printf("%p\n",b);
        printf("%p\n",p);
        printf("%p\n",p1);

        const int c = 20;
        p1 = &c; //true p1 is a nomarl pointer but *p1 is a const value
        //b = 30;    error a is const value b also is a const value
        //a = 30;    error a is const value
        //p = &c;    error p is a const pointer
        printf("%p\n",b);
        printf("%p\n",&c);
        printf("%p\n",p1);
        // --part 2 memcpy also cant't change const int a's value
        int d = 10;
        int *e = &d;
        char j = 'A';
        void *p2;
        void *p3;
        const void *p4 = (const void *)(&j);
        p2 = (void *)(p);
        p3 = (void *)(e);
        if ( p2 == memcpy(p2,p4,1))
        {
                printf("%s\n","memcpy p2 is finsh!");
        }

        if (p3 == memcpy(p3,p4,1))
        {
                printf("%s\n","memcpy p3 is finsh!");
        }
    
        printf("%d\n",a);
        printf("%p\n",&a);
        printf("%d\n",d);
        printf("%p\n",&d);
        printf("%p\n",p2);
        printf("%p\n",p3);
}



</endl;
</endl;
</endl;
</endl;
</endl;
</endl;
</endl;
</endl;
</endl;
</endl;
</endl;
</endl;
</endl;
</endl;
</endl;
</endl;
</endl;
</endl;
相关文章
|
6月前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
570 12
|
12月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
存储 安全 编译器
第二问:C++中const用法详解
`const` 是 C++ 中用于定义常量的关键字,主要作用是防止值被修改。它可以修饰变量、指针、函数参数、返回值、类成员等,确保数据的不可变性。`const` 的常见用法包括:
|
10月前
|
存储 监控 算法
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
206 4
|
12月前
|
存储 Linux iOS开发
Python入门:2.注释与变量的全面解析
在学习Python编程的过程中,注释和变量是必须掌握的两个基础概念。注释帮助我们理解代码的意图,而变量则是用于存储和操作数据的核心工具。熟练掌握这两者,不仅能提高代码的可读性和维护性,还能为后续学习复杂编程概念打下坚实的基础。
Python入门:2.注释与变量的全面解析
|
自然语言处理 编译器 Linux
告别头文件,编译效率提升 42%!C++ Modules 实战解析 | 干货推荐
本文中,阿里云智能集团开发工程师李泽政以 Alinux 为操作环境,讲解模块相比传统头文件有哪些优势,并通过若干个例子,学习如何组织一个 C++ 模块工程并使用模块封装第三方库或是改造现有的项目。
1013 56
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
12月前
|
安全 编译器 C语言
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
|
12月前
|
存储 程序员 C语言
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。

热门文章

最新文章

推荐镜像

更多
  • DNS