首页 > 试题广场 >

const和指针的区别

[问答题]
当使用带有const的指针时其实有两种意思。一种指的是你不能修改指针本身的内容,另一种指的是你不能修改指针指向的内容。听起来有点混淆一会放个例子上来就明白了。 先说指向const的指针,它的意思是指针指向的内容是不能被修改的。它有两种写法。 const int* p; (推荐) int const* p; 第一种可以理解为,p是一个指针,它指向的内容是const int 类型。p本身不用初始化它可以指向任何标示符,但它指向的内容是不能被改变的。 第二种很容易被理解成是p是一个指向int的const指针(指针本身不能被修改),但这样理解是错误的,它也是表示的是指向const的指针(指针指向的内容是不能被修改的),它跟第一种表达的是一个意思。为了避免混淆推荐大家用第一种。 再说const指针,它的意思是指针本身的值是不能被修改的。它只有一种写法 int* const p=一个地址; (因为指针本身的值是不能被修改的所以它必须被初始化) 这种形式可以被理解为,p是一个指针,这个指针是指向int 的const指针。它指向的值是可以被改变的如*p=3; 还有一种情况是这个指针本身和它指向的内容都是不能被改变的,请往下看。 const int* const p=一个地址; int const* const p=一个地址; 看了上面的内容是不是有点晕,没关系,你不用去背它,用的多了就知道了,还有个技巧,通过上面的观察我们不难总结出一点规律,是什么呢?也许你已经看出来了,什么!竟然没看也来,那只好还得听我唠叨了。这个规律就是: 指向const的指针(指针指向的内容不能被修改)const关健字总是出现在*的左边而const指针(指针本身不能被修改)const关健字总是出现在*的右边,那不用说两个const中间加个*肯定是指针本身和它指向的内容都是不能被改变的。有了这个规则是不是就好记多了。
发表于 2019-03-14 22:00:35 回复(0)
取决于const位置,比如const char *p那么这是个常量指针,const修饰的是*p表示*p不能改变;如果是char *const p;这个就是指针常量指,表示p不能改变。
发表于 2019-02-17 20:53:33 回复(0)
const和指针的区别 以下三个语法的区别 (1) const int *p1; (2) int const *p2; (3) int *const p3; 由于指针*p的赋值方式有两种 第一种是:p = &a; 第二种是:*p = a; (1)和(2)的效果是一样的。只能通过第一种方式来修改指针指向的变量 而(3)的方式是只能在一开始的时候指定一个变量,以后不能再指向其他变量。 其实主要是看const后面的变量是什么,只有const后面的变量无法修改 运算符优先级,简单来说就是!>算术运算符>关系运算符>&&>||>赋值运算符
发表于 2019-02-17 16:32:39 回复(0)

中文翻译太搞了,我是想不明白为什么起两个这么容易混淆的名字。

总结一下,区别就是 

  • pointer to const,指向的内容是一个常量,可以改变指向的地址,只要新地址里面也是常量就好。(原来是幽灵街11号,现在改为12号也可以,因为都是幽灵,都是不变的常量) 

  • const pointer,指针本身是一个常量,指向的地址不能改变,里面的内容可以修改。(门牌号11,不管里面住谁,我指向的都是这条街11号) 

当然如果单纯为了区别两个中文,那么const=常量,*=指针,看谁在谁前面就叫对应的名字。

指针常量(pointer to const

  • const int* p;
  • int const* p;
  • 第一种可以理解为,p是一个指针,它指向的内容是const int 类型。p本身不用初始化可以指向任何标示符,但它指向的内容是不能被改变的。
  • 第二种很容易被理解成,p是一个指向int的const指针(指针本身不能被修改),但这样理解是错误的,它也是表示的是指向const的指针(指针指向的内容是不能被修改的),它跟第一种表达的是一个意思。

常量指针(const pointer

  • int* const p;
  • 这种形式可以被理解为,p是一个指针,这个指针是指向int的const指针,指针本身的值是不能被修改的。

规律:

  • 指向const的指针(指针指向的内容不能被修改),const关健字总是出现在*的左边,
  • 而const指针(指针本身不能被修改),const关健字总是出现在*的右边,
  • 那不用说两个const中间加个*,肯定是指针本身和它指向的内容都是不能被改变的。
编辑于 2020-08-10 23:59:19 回复(0)
简单概括: 1.指向常对象的指针变量 : const Time *p1=&t1; 只能访问对象公有的成员,不能改变指针所指对象的公有成员(* p1).num!=12; 但可以改变指针的指向 p1=&t2; 对象不灵活,指针灵活! 2.指向普通对象的常指针: Time * const p2 =&t2; 不能改变指针的指向即 p2!=&t3; 但是可以改变指向对象的公有成员的值(*p2).num=11; 指针不灵活但是对象灵活!
发表于 2019-03-18 10:08:15 回复(0)
通俗易懂的描述总结:
    1、* 前面的修饰代表指针指向内容的类型
    2、* 后面的修饰代表指针的类型
比如:const int * p   代表p是一个指针,指向的内容为const int类型,所以指向的内容不能被修改,指针的指向可以修改,即可以移动指针
            int const * p 代表p是一个指针,指向的内容为int consrt(与const int类型相同),所以指向的内容不能被修改,指针的指向可以修改,即可以移动指针
          int * const p  代表p是一个const类型的指针,指向的内容的类型为int类型,所以指向的内容可以修改,但是指针是const类型,所以不能移动指针
发表于 2022-10-21 11:53:15 回复(0)
const是只读,指针是存储的是一个地址,其值可以改变
发表于 2019-05-08 13:47:31 回复(0)

只依赖const所在的位置,依赖其他的容易晕



发表于 2019-04-20 11:35:41 回复(0)
const int * pOne; //指向整形常量 的指针,它指向的值不能修改 int * const pTwo; //指向整形的常量指针 ,它不能在指向别的变量,但指向(变量)的值可以修改。 const int *const pThree; //指向整形常量 的常量指针 。它既不能再指向别的常量,指向的值也不能修改。 理解这些声明的技巧在于,查看关键字const右边来确定什么被声明为常量 ,如果该关键字的右边是类型,则值是常量;如果关键字的右边是指针变量,则指针本身是常量
发表于 2019-03-11 09:59:45 回复(0)