指针常量和常量指针的一些整理

近来学习指针,碰到一个关于指针常量和常量指针的问题,之前被弄得是稀里糊

涂的,今天特意查资料整理了一下,现拿出来和大家分享,有什么弄错的地方请

大家不吝赐教,共同进步。

首先常量指针,咱们可以这样理解,常量指针即是一个指向常量的指针,既然指

向的是一个常量,那它所指向的值当然就不能变了。但是它本身的值,即它的地

址是可以变的,咱们可以把它指向别的地址。

而指针常量,则可以理解为一个常量,什么时候常量??指针常量,即指针是常

量,则它的地址是不可变的,但是它所指向的地址里的值是可以变的。

一个int型的常量指针是这样定义的:int const* 指针名。int const(常量)*(

指针)指针名
一个int型的指针常量是这样定义的:int* const 指针名。int*(指针) const(常

量)指针名
观察上面两个的定义我们是不是可以根据*和const的位置来一眼判断是一个指针

常量还是一个常量指针呢???*前const后是指针常量,const前*后是常量指针!!

!呵呵,当然最重要的还是要理解它们所代表的含义,哪个能改,哪个不能!

现在可以通过下面的一段代码再来看看自们理解的怎么样了。试试看下面的代码

哪里有问题,为什么!

#include<stdio.h>
int main(){
  int i=0;
  int j=1;
  int x;
  const int * pi=&i;
  *pi=22;
  pi=&j;
  int * const pj=&j;
  *pj=22;
  pj=&i;
  const int * px=&x;
  const int h=2;
  const int* ph=&h;
  int* const ph2=&h;
}

理解:

#include<stdio.h>
int main(){
  int i=0;
  int j=1;
  int x;
  const int * pi=&i;//定义一个常量指针pi,它指向的地址是i
  *pi=22;//有问题了,pi是一个常量指针,它指向的地址的值你竟敢改
  pi=&j;//没问题,pi虽然指向的是一个常量,但本身还是自由的,还是可以改

变的
  int * const pj=&j;//这里定义一个指针常量,指向的是j的地址。
  *pj=22;//没问题,指针常量只是指针是个常量,地址是常量,但我里面的内容

可以变啊,好歹也有点自由啊
  pj=&i;//这里就不对了,既然是个常量就乖乖地别换地址
  const int * px=&x;//这里也没问题,可能就有人会有疑问了,你px不是一个

常量指针吗,你不是说常量指针是一个指向常量的指针吗,x又不是一个常量,杂

就可以呢?呵呵,这个是我之前有疑问,后来我把px所指向的值输出来,然后再

试图给px赋值,但不行,x已经被赋上了一个垃圾值。
所以说的常量指针是一个指向常量的指针这仅仅是便于我们理解,事实上它还是

可以指向一个变量的,不过一旦定义后该变量也就成了一个不变的量了。
  const int h=2;
  int* const ph2=&h;//有问题,我上面定义了h是一个常量,你怎么可以用一个

指针变量来指向h呢。若是可以的话,你指针常不是可以修改所指向地址的内容,

那不意味着可以修改h的值了,可h是个常量,怎么能让你这么做!!!
  const int* ph=&h;//所以还是用常量指针吧,指向的地址的值不变。
}

其实我觉得就是中文翻译的比较故弄玄虚。

你所谓的常量指针,其实英文是 pointer to const,经常翻译成就叫指向常量的指针。其实这么叫就不那么容易混淆。
另外指针常量,英文是 const pointer,经常也能看见翻译成常指针的,要是这么叫反而感觉容易和上面那个搞混。

而且有关 constant 这个词,做为术语,有一定的歧义。有的时候,它只包含诸如 1, 1L, "abc", 12.5 ‘c‘ 这样的东西。有的时候他也指 const variable。就是指 const int 这类东西,声明一个变量,但看成常量。(常见的是翻译成“常量变量”或者“常变量”,不过按照你的那个命名逻辑应该叫“变量常量”)。而且很多时候在上下文里其实仅指后者,因为前者比较简单,通常不需要考虑。

后来标准委员会换了一个词,用 literal 来代表 1, ‘c‘ 这样的东西,一般被翻译成“字面”。比如前者叫整形字面,后者叫字符字面。而常量变量就统称为常量,比如 const int a,就说声明了一个整形常量(const integer)。但中文不知道是不是习惯问题,也有把 literal 这个词翻译成 字面常量 的。

总之翻译还是很混乱的。不过楼主讲的还算清楚,只要别死抠这两个中文术语就行了。

另外我也看到过另一种记忆的方法:
const int * const p;
看成 const int (* const p)。把 * 前的理解成加完 * 之后的东西,括号里的理解成未加星的东西。
当出现比如 : *p = 5; 这样的语句的时候,由于有星了,那么到括号外头找,左边的东西本质上是 const int。
而 p = 5; 找括号里面的是 const p,那么这就是给一个常量赋值,也不行。

这种记法对复杂一点的东西也有用:

程序代码:

int f() { return 0; }

int main()
{
    int (*p)(void);
    p = &f;

int a[5];
    int (*q)[5];
    q = &a;

return 0;
}

int (*p)(void)。 p 是一个指针,而 *p 是 int _ (void),所以是个指向函数的指针。
int (*q)[5]。q 是一个指针,而 *q 是 int [5],所以 q 是个指向 int [5] 这样数组的指针。
当然不管怎么记,复杂的东西还是会比较复杂。

时间: 2024-10-17 09:58:27

指针常量和常量指针的一些整理的相关文章

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

3种与const.指针及指针指向的对象有关的情形: 1.指向常量对象的指针 2.指向某个对象的常量指针 3.指向常量对象的常量指针 在第一种情况中,我们不能修改被指向的对象,但可以使指针指向其他对象: const char* pstring("Some text"); 在第二种情况中,我们不能修改指针中存储的地址,但可以修改指针指向的对象: char* const pstring("Some text"); 在最后一种情况中,指针和被指向的对象都被定义成常量,因此都

指针常量&amp;指向常量的指针

3 4 #include "stdafx.h" 5 6 int main(int argc, char* argv[]) 7 { 8 int a; 9 int b; 10 int* const p1 = &a; //常量指针,指针不可以改,但是指针指向的内容可以改. 11 const int* p2; //指向常量的指针,指针可以改,但是指针指向的内容不可以改. 12 13 const int c = 3; 14 15 a = 1; 16 b = 2; 17 // p1 = &

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

/*指针总结: 1:指针未被初始化一个地址或刚删除一个指针都要将其初始化为0,否则的话将会导致该指针失控 2:假如不想改变一个指针,那么将该指针定义为const, 假如不想改变该指针指向的值,将指针指向的值定义为const 假如即不想改变指针又不想改变指针指向的值,那么将指针和指针指向的值都定义为const 在new堆中创建一个对象,然后将内存地址赋给指针,之后我们就可以通过内存地址访问堆中的对象, 假如要删除该对象,我们只需要使用关键字delete,那么就会删除指针指向的对象并释放存储对象的内

c语言常量指针赋值给变量指针导致警告

常量指针定义:常量是形容词,指针是名词,以指针为中心的一个偏正结构短语.这样看,常量指针本质是指针,常量修饰它,表示这个指针乃是一个指向常量的指针.指针指向的对象是常量,那么这个对象不能被更改.常量指针的使用要注意,指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改,也就是说常量指针可以被赋值为变量的地址,之所以叫做常量指针,是限制了通过这个指针修改变量的值. 在C/C++中,常量指针是这样声明的: 1)const int *p; 2)int const *p; 例子: int

C指针常量与常量指针

c语言中声明常量的两种方式 const int value int const value 如果要声明常量的指针,即指向常量的指针,则可以参考上面的常量声明修改一下 const int *ptr int const *ptr 把*ptr看成一个整体,那么*ptr中的ptr就是指向常量的指针了.顾名思义,指向常量的指针,那么就不可以通过这个指针去修改这个值了. #include <stdio.h> int main(){ int val = 123; int const *ptr = &

指针常量和常量指针

这两个概念经常分不清,今天好好总结一下. 一.指针常量 先说指针常量,是因为它和我们常用的数组有关系. 指针常量的声明 int * const p; 指针声明操作符*在常量限定符const前面,叫做指针常量.忽然发现了一点规律^_^. const限定符修饰的是指针.数组名就是一个指针常量.而数组名和指针有什么区别呢?可以通过引用数组名去修改指向的内存,但是自身不可以被赋值,不可以进行++.–操作. 二.常量指针 常量指针的声明 const int * p1; int const * p2; 常量

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

(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,并且不能通过它修改它指向的地址的内容

CII-2.4指针常量和常量指针

#define T Stack_T typedef struct T *T; struct T { int count; struct elem { void *x; struct elem *link; } *head; } const T stk //指针常量, const修饰struct T *.地址不能变. const struct T *stk //指向常量的指针, const修饰struct T.数据不能变. CII-2.4指针常量和常量指针,布布扣,bubuko.com

常量指针、指针常量、常量指针常量

1 #include<stdio.h> 2 3 int main() 4 { 5 int a = 120; 6 int b = 60; 7 8 /* 9 * 常量指针, 不可以修改指向地址 10 * 的存储空间里的值,但可以修改指向地址的值 11 */ 12 int const *p1 = &a; 13 const int *p2 = &a; //常量指针 14 15 /* 16 * 指针常量,不可以修改指向的地址 17 * 但可以修改所指向地址存储空间里的内容 18 */ 1