程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

指针与const(指针与二维数组)

balukai 2025-03-17 15:57:51 文章精选 3 ℃

指针与const

与指针相关的const有四种:

const char * a; // 指向const对象的指针或者说指向常量的指针。
char const * a; // 同上
char * const a; // 指向类型对象的const指针。或者说常指针、const指针。
const char * const a; // 指向const对象的const指针。

小结:
如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

另一种解读方式
利用英文从右边往左边读,并且以to为分界,to之前为描述指针的特性,to之后为描述目标的特性

const char * p; //p is a pointer to const char
char const * p; //同上
char * const p; //p is a const pointer to char
const char * const p; //p is a const pointer to const char

当指针被加上const特性,则指针不可改变指向的地址
当指向的目标特性为char,则内容可以透过指针被修改,如: *char='y';
当指向的目标特性为const char,则内容不可透过指针修改

具体使用如下:

(1) 指向常量的指针

const int *ptr;
*ptr = 10; // error

ptr是一个指向int类型const对象的指针,const定义的是int类型,也就是ptr所指向的对象类型,而不是ptr本身,所以ptr可以不用赋初始值。但是不能通过ptr去修改所指对象的值。

除此之外,也不能使用void*指针保存const对象的地址,必须使用const void*类型的指针保存const对象的地址。

const int p = 10;
const void * vp = &p;
void *vp = &p; // error

另外一个重点是:允许把非const对象的地址赋给指向const对象的指针

将非const对象的地址赋给const对象的指针:

const int *ptr;
int val = 3;
ptr = &val; // ok

我们不能通过ptr指针来修改val的值,即使它指向的是非const对象!

我们不能使用指向const对象的指针修改基础对象,然而如果该指针指向了非const对象,可用其他方式修改其所指的对象。可以修改const指针所指向的值的,但是不能通过const对象指针来进行而已!如下修改:

int *ptr1 = &val;
*ptr1=4;
cout<<*ptr<<endl;

小结:
1.对于指向常量的指针,不能通过指针来修改对象的值。
2.不能使用void*指针保存const对象的地址,必须使用const void*类型的指针保存const对象的地址。
3.允许把非const对象的地址赋值给const对象的指针,如果要修改指针所指向的对象值,必须通过其他方式修改,不能直接通过当前指针直接修改。

(2) 常指针

const指针必须进行初始化,且const指针指向的值能修改,但指向不能修改。

#include
using namespace std;
int main(){
    int num=0, num1=1;
    int * const ptr=# // const指针必须初始化!且const指针的指向不能修改
    ptr = &num1; // error! const指针不能修改指向!
    cout<<*ptr<<endl;
}

代码出现编译错误:const指针不能修改指向。

解释

#include
using namespace std;
int main(){
    int num=0, num1=1;
    int * const ptr=# // const指针必须初始化!且const指针的指向不能修改
    *ptr = 1;
    cout<<*ptr<<endl;
}

代码无事发生,正常输出1。

最后,当把一个const常量的地址赋值给ptr时候,由于ptr指向的是一个变量,而不是const常量,所以会报错,出现:const int* -> int *错误!

解释

#include
using namespace std;
int main(){
    const int num=0;
    int * const ptr=# // error! const int* -> int*
    cout<<*ptr<<endl;
}

上述若改为 const int *ptr或者改为const int *const ptr,都可以正常!

(3)指向常量的常指针

理解完前两种情况,下面这个情况就比较好理解了:

const int p = 3;
const int * const ptr = &p; 

ptr是一个const指针,然后指向了一个int 类型的const对象。

最近发表
标签列表