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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介:  关于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;
相关文章
|
1月前
|
自然语言处理 编译器 Linux
|
21天前
|
SQL 存储 Oracle
南大通用GBase 8s数据库游标变量解析:提升数据库操作效率
南大通用GBase 8s 数据库游标变量解析:提升数据库操作效率
|
23天前
|
设计模式 安全 数据库连接
【C++11】包装器:深入解析与实现技巧
本文深入探讨了C++中包装器的定义、实现方式及其应用。包装器通过封装底层细节,提供更简洁、易用的接口,常用于资源管理、接口封装和类型安全。文章详细介绍了使用RAII、智能指针、模板等技术实现包装器的方法,并通过多个案例分析展示了其在实际开发中的应用。最后,讨论了性能优化策略,帮助开发者编写高效、可靠的C++代码。
32 2
|
1天前
|
安全 编译器 C++
C++ `noexcept` 关键字的深入解析
`noexcept` 关键字在 C++ 中用于指示函数不会抛出异常,有助于编译器优化和提高程序的可靠性。它可以减少代码大小、提高执行效率,并增强程序的稳定性和可预测性。`noexcept` 还可以影响函数重载和模板特化的决策。使用时需谨慎,确保函数确实不会抛出异常,否则可能导致程序崩溃。通过合理使用 `noexcept`,开发者可以编写出更高效、更可靠的 C++ 代码。
7 0
|
1天前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
10 0
|
1天前
|
存储 安全 编译器
第二问:C++中const用法详解
`const` 是 C++ 中用于定义常量的关键字,主要作用是防止值被修改。它可以修饰变量、指针、函数参数、返回值、类成员等,确保数据的不可变性。`const` 的常见用法包括:
16 0
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
82 4
|
1月前
|
自然语言处理 编译器 Linux
告别头文件,编译效率提升 42%!C++ Modules 实战解析 | 干货推荐
本文中,阿里云智能集团开发工程师李泽政以 Alinux 为操作环境,讲解模块相比传统头文件有哪些优势,并通过若干个例子,学习如何组织一个 C++ 模块工程并使用模块封装第三方库或是改造现有的项目。
|
2月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
2月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
56 1

推荐镜像

更多