指针和引用与及指针常量和常量指针

指针和引用的区别

1.存在空指针,但是不存在空引用。

2.指针可以不初始化,而引用必须初始化,并且,引用的目标一旦确定,后面不能再更改,指针可以更改其指向的目标。

3.指针是一个实体,而引用仅是个别名。

4.引用是类型安全的,而指针不是 (引用比指针多了类型检查。

5.指针和引用的自增(++)运算意义不一样,对引用的操作直接反应到所指向的对象,而不是改变指向;而对指针的操作,会使指针指向下一个对象,而不是改变所指对象的内容。

6.存在指针数组 ,不存在引用数组,不允许使用引用数组,因为引用没有内存的分配。

7.引用传递过程中,被调函数的形式参数作为局部变量在栈中开辟内存空间,但是这时存放的是由主调函数放进来的实参变量的地址

同样,指针传递参数时,指针中存放的也是实参的地址,但是在被调函数内部指针存放的内容可以被改变,即可能改变指向的实参,所以并不安全,而引用则不同,它引用的对象的地址一旦赋予,则不能改变。

测试

跑一跑,然后对比理解看看。

#include <iostream>
using namespace std;
int main()
{
    /*
    指针和引用使用细节
    */
    cout<<"指针和引用使用细节: "<<endl;
    int a =3,c=3,d=3;
    int *p = &a;
    int &b = a;
    cout<<p<<" "<<*p<<" "<<&p<<endl;
    cout<<--(*p)<<endl; //通过指针改变指向的值
    cout<<b<<" "<<&b<<" "<<a<<endl;
    cout<<"********************************"<<endl;

    /*
    常量指针和常量引用
    */
    //这种一般是用于指向常量,这里例举的是普通变量,一般不推荐这么用,太容易混淆。
    const int *p2 = &c; //*p2是常量
    const int &b2 = c;
    cout<<"常量指针和常量引用: "<<endl;
    cout<<*p2<<endl;
    //cout<<--(*p2)<<endl; //常量指针不可改
    c--;  //指向的变量可改,如果c本身为常量便不可改
    cout<<*p2<<endl;
    //cout<<--b2<<endl; //常量引用不可改
    c--;
    cout<<b2<<endl;
    p2 = &a; //p2不是常量,可改变指向
    cout<<*p2<<" "<<p2<<endl;
    cout<<"********************************"<<endl;

    /*
    指针常量和引用常量
    */
    cout<<"指针常量和引用常量: "<<endl;
    int *const p3 = &d;  //p3是常量
    int &b3 = d; //引用本身就是常量,不用再使用const修饰
    //p3 = &a;  //出错,p3为常量,不可修改指向
    cout<<*p3<<endl;
    cout<<--(*p3)<<endl; //可修改
    d--; //这个自然是可改的
    cout<<*p3<<" "<<d<<endl;
    cout<<"********************************"<<endl;

    /*
    常量指针常量
    */
    cout<<"常量指针常量: "<<endl;
    const int x=3;
    const int *p4 = &x; //如果是常量,指针的定义只能这样`const int *p = &x;`且必然不可改
    cout<<*p4<<" "<<x<<endl;

    return 0;
}

对于指针常量和常量指针的记忆

有一个规则可以很好的区分const是修饰指针,还是修饰指针指向的数据——画一条垂直穿过指针声明的星号(*),如果const出现在线的左边,指针指向的数据为常量;如果const出现在右边,指针本身为常量。而引用本身与天俱来就是常量,即不可以改变指向。

也可以这样记:

  • 指针常量 -> 指针为常量,不可改变指向,但可修改指向的值。
  • 常量指针 -> 常量的指针,可改变指向,不可修改指向的值。

参考

有疑问时多看看(推荐):C++中引用,指针,指针的引用,指针的指针

如有问题,请批评指正,谢谢。

原文地址:https://www.cnblogs.com/clwsec/p/11478575.html

时间: 2024-11-06 20:56:07

指针和引用与及指针常量和常量指针的相关文章

指针的指针,指针的引用(不是二维指针)

详解c++指针的指针和指针的引用 展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递. 如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来 的值.我们用下边的代码说明一下问题: int m_value = 1; void func(int *p) {

C++ 指针与引用 知识点 小结

[摘要] 指针可以指向变量.数组.字符串.函数.甚至结构体.即指针可以指向不同数据对象.指针问题 包括 常量指针.数组指针.函数指针.this指针.指针传值.指向指针的指针 等.主要知识点包括:1.指针与引用在概念上的三个区别及其在const.sizeof.自增运算上的差异:2.熟记经典swap函数的指针实现与引用实现,并能反映输出错误的两个函数的思想弊端:3.熟记GetMem函数的错误形式以及错误产生的原因:4.比较数组.指针与静态变量作为函数返回值的差异:5.str.*str以及&str三者

详解c++指针的指针和指针的引用

展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递. 如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来 的值.我们用下边的代码说明一下问题: int m_value = 1; void func(int *p) { p = &m_value; } i

C++ 中指针与引用的区别

指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过void*指针操作对象必须进行类型转化.     ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址: 引用是某块内存的别名.     ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需要解引用: 3. 引用只能在定义时被初始化

C/C++:提升_指针的指针和指针的引用

C/C++:提升_指针的指针和指针的引用 ◇写在前面 今天在使用指针的时候我发现了一个自己的错误. 我刚开自以为是觉得输出的两个P都是6,当时觉得两个p所指的地址相同,要修改就都修改了. 这是一个很低级的错误,两个p所指的地址相同,但是这两个指针的地址是不一样的. 好比两个人都知道火车站怎么走,但不能说这两个人是一个人,更何况在修改中一个人已经忘了火车站,它只知道高铁站怎么走,那另一个只知道火车站的并没有受到影响,他还是只知道火车站. 好了,那么如何做到main修改里面的p呢?要用到两种技术:

无效的指针、引用和迭代器

首先以示例代码为例: vector<int> v; //添加一些元素 fir(int i=0; i<10; ++i) v.push_back(i); int* my_favorite_element_ptr = &v[3]; cout<<"My favorite element = "<<(*my_favorite_element_ptr)<<endl; cout<<"Its address = &qu

指针和引用的区别(c/c++)

http://blog.csdn.net/thisispan/article/details/7456169 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名.  ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需要解引用: 3. 引用只能在定义时被初始化一次,之后不可变:指针可变: 引用"从一而终" ^_^ 4. 引用没有 const,指针有 const,const 的指针不可变: 5.

【转】指针和引用的区别

c++中的引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需要解引用: 3. 引用只能在定义时被初始化一次,之后不可变:指针可变: 引用“从一而终” ^_^ 4. 引用没有 const,指针有 const,const 的指针不可变: 5. 引用不能为空,指针可以为空: 6. “sizeof 引用”得到的是所指向的变量(对象)的大小

C++指针和引用

 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名.  ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需要解引用: 3. 引用只能在定义时被初始化一次,之后不可变:指针可变: 引用“从一而终” ^_^ 4. 引用没有 const,指针有 const,const 的指针不可变: 5. 引用不能为空,指针可以为空: 6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针