指针总结以及常量指针与指向常量的指针与指向常量的常指针

/*指针总结:
1:指针未被初始化一个地址或刚删除一个指针都要将其初始化为0,否则的话将会导致该指针失控
2:假如不想改变一个指针,那么将该指针定义为const,
假如不想改变该指针指向的值,将指针指向的值定义为const
假如即不想改变指针又不想改变指针指向的值,那么将指针和指针指向的值都定义为const

在new堆中创建一个对象,然后将内存地址赋给指针,之后我们就可以通过内存地址访问堆中的对象,
假如要删除该对象,我们只需要使用关键字delete,那么就会删除指针指向的对象并释放存储对象的内存空间,
但是我们要注意一点,指针并没有被删除,并且它仍指向原来的内存空间,因此我们必须对它的值清零或重新赋值*/

/*常量指针:自身不可以改变,但是它指向的目标却是可以改变的
用法:int a, int *const p = a;常量指针必须在定义时初始化*/

/*区分常量指针与指向常量的指针
指向常量的指针:
该指针指向的目标是不可以被修改的,但是该指针是可以被修改的
指向常量的指针只是限制我们修改它的目标,但是它本身是可以被修改的
const A *p2 = new A; //定义指向常量的指针*/

/*指向常量的常指针,它本身不可修改,它指向的目标也是不可修改的
定义方法:
const A*const p1 = new A;这就定义了一个指向常量的常指针*/
#include <iostream>
using namespace std;
class A
{
public:
    int get() const{return i;}
    void set(int x){i = x;}
private:
    int i;
};
int main()
{
    A *p = new A;
    p->set(10);
    cout <<"p:" << p << endl;
    p++;
    cout << "p:" << p << endl;
    A *const p1 = new A; //定义常量指针
    p1->set(11);
    cout <<"p1:" << p1 << endl;
    cout << p1->get() << endl;
    p1->set(11111);
    cout <<"p1:" << p1 << endl;
    cout << "p1:" << p1->get() << endl;
    const A *p2 = new A; //定义指向常量的指针
    p2++;
    const A *const p3 = new A;
    return 0;
}
时间: 2024-10-22 23:14:51

指针总结以及常量指针与指向常量的指针与指向常量的常指针的相关文章

常指针和指向常量的指针和指向常量的常指针

(1)指向常量的指针:是一个指向的内容是常量的指针变量,const int *p=&x;不可修改*p的内容,但可以让指针p指向另一个地址,和int const *p一样 (2)常指针:int *const p=&x指针本身是个常量,固定指向某一变量,因此p不可变,但是*p可变 (3)指向常量的常指针:const int *const p=&x,指针p永远指向x,并且不能通过它修改它指向的地址的内容

c语言结构体&amp;常指针和常量指针的区别

结构体: 关系密切但数据类型不尽相同, 常指针和常量指针的区别: char * const cp : 定义一个指向字符的指针常数,即const指针,常指针. const char* p : 定义一个指向字符常数的指针,即常量指针. char const* p : 等同于const char* p[2]. 理解:const char *p; 常量指针,指向一块区域,这块区域不可写,只能读.char * const p; 指针常量,指向一块区域,这块区域可读可写,但是指针的值初始后就不能改,类似于一

直观理解C语言中指向一位数组与二维数组的指针

一维数组和指针: 对于一位数组和指针是很好理解的: 一维数组名: 对于这样的一维数组:int a[5];  a作为数组名就是我们数组的首地址, a是一个地址常量 . 首先说说常量和变量的关系, 对于变量来说, 用箱子去比喻再好不过了, 声明一个变量就声明一个箱子,比如我们开辟出一个苹果类型的箱子, 给这个变量赋值就是把盛放苹果的箱子中放入一个实实在在的苹果, 这就是变量的赋值.  而对于数组来说, 就是一组类型相同的箱子中,一组苹果箱子, 可以放入不同的苹果. 一维数组空间: 变量被声明后, 我

#运算符、不同的指针类型、数组和指针、指针运算、堆、栈、静态区、只读区、下标VS指针

#运算符:用于在预编译期将宏参数转换为字符串 #define CONVERS(x)  #x   //注:没用双引号包括. 不同类型的指针占用的内存空间大小相同. 局部变量 定义: a[5]; 打印a[i]时,a[i]为随机数. 若定义a[5]={1,2}; 打印时,a[0]=1;a[1]=2;a[2]=a[3]=a[4]=0; 数组地址与数组名: 1.数组名代表数组首元素的地址.  a=&a[0]; 2.数组的地址需要用取地址符号&才能得到 (&a) 3.数组首元素的地址值与数组的

对象的常指针与对象的常引用

如下所示: 定义一个类 1 class Coordinate { // 坐标类 2 public: 3 Coordinate(int x, int y); 4 ~Coordinate(void); 5 6 void SetX(int x); 7 void SetY(int y); 8 void PrintInfo(void) const; // 常成员函数 9 int GetX(void); 10 int GetY(void); 11 private: 12 int m_iX; 13 int m

Qt之美(一):d指针/p指针详解(解释二进制兼容,以及没有D指针就会崩溃的例子。有了D指针,所使用的对象大小永远不会改变,它就是该指针的大小。这个指针就被称作D指针)good

Translated  by  mznewfacer   2011.11.16 首先,看了Xizhi Zhu 的这篇Qt之美(一):D指针/私有实现,对于很多批评不美的同路人,暂且不去评论,只是想支持一下Xizhi Zhu,在引用一下Jerry Sun的话,“C++需要宏定义就像需要设计模式一样.也许你不知道,宏是图灵完全(turing complete)的,至少LISP下是这样,C/C++需要宏,几乎所有重要的C/C++库都需要和依赖宏.这些都超过咱们的想象,宏能带给我们所谓语法糖(Synta

函数指针玩得不熟,就不要自称为C语言高手(函数指针是解耦对象关系的最佳利器,还有signal)

记得刚开始工作时,一位高手告诉我说,longjmp和setjmp玩得不熟,就不要自称为C语言高手.当时我半信半疑,为了让自己向高手方向迈进,还是花了一点时间去学习longjmp和setjmp的用法.后来明白那不单是跳来跳去那样简单,而是一种高级的异常处理机制,在某些情况下确实很有用. 事实上,longjmp和 setjmp玩得熟不熟与是不是C语言高手,不是因果关系.但是,如果可以套用那位高手的话,我倒想说如果函数指针玩得不熟,就不要自称为C语言高手.为什么这么说呢,函数指针有那么复杂吗?当然不是

const(每个对象中的常量), static const(类的编译时常量)

1 #include <iostream> 2 using namespace std; 3 4 class Values 5 { 6 private: 7 8 //类里的 9 const int cSize; //常量成员的初始化,必须在构造函数中进行,每个对象都有,只是成员常量数据在初始化就不能改变 10 11 12 //禁止在类内对"非const的静态成员"进行初始化 13 //static int sFloat = 100; //Values.cpp:8:24: e

C++常变量和文字常量

文字常量编译之后在代码区,不可寻址. 常变量可以寻址. 运行时常变量并不是放在只读内存中.而是和一般变量一样放在数据区. 所以运行时如果能够获得常变量的地址,一样可以通过特殊的途径对它们进行修改. 1 #include<iostream> 2 using namespace std; 3 void ShowValue(const int & i){ 4 cout<<i<<endl; 5 } 6 int main(){ 7 const int j = 5; 8 i