Loading

C++基础_几种C++中的原始指针

几种C++中的原始指针

const pointer 与pointer to const

  • 关于const修饰的部分
    -- 看左侧最近部分;
    -- 如果左侧没有,则看右侧;

例子:

char str[] = {"abc"};
char const *pStr1 = "hello";
char* const pStr2 = "yes";
char const * const pStr3 = "zebra";
pStr1 = str;
// pStr2 = str;  //这里将pStr2重新指向了str的内存地址,但是由于const修饰了*,则会报错pStr2不可改
// pStr3 = str;  //这里将pStr3重新指向了str的内存地址,但是由于const修饰了*,则会报错pStr3不可改

解析:
char str[] = {"abc"}; => 定义一个字符数组
char const *pStr1 = "hello"; => 定义一个指针,该指针的const修饰左边的char,代表指向的内存地址的内容不可修改(是常量)
char* const pStr2 = "yes"; => 定义一个指针,该指针的const修饰左边的*,代表指向的内存地址不可修改,也就是说该指针无法改变指向地址
char const * const pStr3 = "zebra"; => 定义一个指针,第一个const修饰左边的char,第二个const修饰左边的*,表示指针指向的内存地址不可修改同时指向的内存地址的内容也不可修改

指向指针的指针

int a = 123;
int* b = &a;
int** c = &b;

解析:*操作符具有从右向左的结合性,**c这个表达式相当于*(*c)->这里指的的引用,并不是定义实话的int**

表达式 表达式的值
a 123
b &a
*b a的值即123
c &b
*c b的值即&a
**c *b即a的值即123

未初始化和非法的指针

例子:
int* a;
*a = 12;
这里定义了一个int类型的指针a,但是并没有初始化赋值,这就导致a指向的地址是未知的,它指向哪里是未知的。
运气好的话:a指向的地址可能是一个非法地址,程序会出错,从而终止
但是最坏的情况是:
定位到一个可以访问的地址,无意修改了它,这样的错误难以捕捉,引发的错误可能与原先用于操作的代码完全不想干!
所以:用指针进行间接访问之前,一定要非常小心,确保它已经初始化,并被恰当的赋值。

NULL指针

一个特殊的指针变量,表示不指向任何东西。
如:
int* a = NULL;
NULL指针的概念非常有用:它给了一种方法,来表示特定的指针目前未指向任何东西。
使用的注意事项:对于一个指针,如果已经知道将被初始化为什么地址,那么请给它的地址赋值,否则请把它设置为NULL。在对一个指针进行间接引用之前,请先判断这个指针的值是否为NULL。

野指针

指向“垃圾”内存的指针。if判断对它不起作用,因为没有置NULL;
一般有三种情况:

  • 指针变量没有初始化;
  • 已经释放不用的指针没有置NULL,如delete和free之后的指针;
  • 指针操作超越了变量的作用范围;

指针使用的注意事项:
没有初始化的,不用的或者超出范围的指针请把它置为NULL。

posted @ 2021-10-20 07:22  MrSu  阅读(96)  评论(0编辑  收藏  举报