【转】const int *p和int * const p的区别(常量指针与指向常量的指针)

【转】作者:xwdreamer   出处:http://www.cnblogs.com/xwdreamer

对于指针和常量,有以下三种形式都是正确的:

const char * myPtr = &char_A;//指向常量的指针
char * const myPtr = &char_A;//常量的指针
const char * const myPtr = &char_A;//指向常量的常量指针

下面依次对这三种类型进行介绍。

因为*操作符是左操作符,左操作符的优先级是从右到左,对于

1.常量指针(Constant Pointers)

int * const p

先看const再看* ,是p是一个常量类型的指针,不能修改这个指针的指向,但是这个指针所指向的地址上存储的值可以修改。

实例1:

#include<iostream>
#include<stdlib.h>
using namespace std;

void main()
{
    int i1=30;
    int i2=40;
    int * const pi=&i1;//这里的pi指针式常量。
    //pi=&i2;     //注意这里,pi不能再这样重新赋值了,即不能再指向另一个新地址。所以我已经注释了它。
    printf("%d\n", *pi ) ;   //输出是30
    i1=80;     //5.想想看:这里能用*pi=80;来代替吗?可以,这里可以通过*pi修改i1的值。
    printf("%d\n", *pi ) ;   //输出是80
    system("pause");
}

实例2:

char char_A = ‘A‘;
char char_B = ‘B‘;

char * const myPtr = &char_A;
myPtr = &char_B;    // error - can‘t change address of myPtr

2.指向常量的指针(Pointers to Constants)

const int *p

先看*再看const,定义一个指针指向一个常量,不能通过指针来修改这个指针指向的值。

实例3:

#include<iostream>
#include<stdlib.h>
using namespace std;

void main()
{
    int i1=30;
    int i2=40;
    const int * pi=&i1;
    printf("%d\n", *pi ) ;   //输出是30
    pi=&i2;     //注意这里,pi可以在任意时候重新赋值一个新内存地址
    i2=80;     //想想看:这里能用*pi=80;来代替吗?当然不能
    printf("%d\n", *pi ) ;   //输出是80

    system("pause");
}

实例4:

char char_A = ‘A‘;
const char * myPtr = &char_A;
*myPtr = ‘J‘;    // error - can‘t change value of *myPtr

所以指针p所指向的整型数是一个常量,其值不能被修改。

3.指向常量的常量指针

对于“指向常量的常量指针”,就必须同时满足上述1和2中的内容,既不可以修改指针的值,也不可以修改指针指向的值。

4.引入字符数组和字符指针

字符数组和字符指针的定义如下:

char a[] = "I Love You!"; //定义了一个字符数组
char *p = "I Love You!";  //定义了一个字符指针

可以将a理解为常量指针,而p为指向常量的指针,代码实例如下:

#include<iostream>
#include<stdlib.h>
using namespace std;

void main()
{
    char a[] = "I Love You!"; //定义了一个字符数组,数组名a是一个常量指针,指向的位置不变,都是数组第一个元素的位置
    char *p = "I Love You!";  //定义了一个字符指针,指针p指向一个字符串常量,这个字符串常量不能修改

    //*(p+1)=‘a‘;//错误,不可以修改指针指向的值,所以这里注释掉。
    a[1]=‘a‘;//常量指针,不能修改指针的值,但是可以修改指针所指向的值。
    //a=p;//错误,a是常量指针,不可修改其值。
    cout<<a<<endl;
    cout<<p<<endl;

    cout<<a[1]<<endl;
    cout<<*(p+2)<<endl;

    system("pause");
}

输出值为:

IaLove You!
I Love You!
a
L

时间: 2024-10-11 15:34:00

【转】const int *p和int * const p的区别(常量指针与指向常量的指针)的相关文章

不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

[源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, const 对象的引用 作者:webabcd 介绍不可或缺 Windows Native 之 C++ this 指针 对象数组 对象和指针 const 对象 const 指针和指向 const 对象的指针 const 对象的引用 示例1.CppEmployee 类CppEmployee.h #pragma

C++ 指针(不论什么一个指针本身的类型都是unsigned long int型)

1.指针数组: 即 数组的元素是指针型; 例:int*pa[2]; 明明是一维的指针数组.竟当作二维数组用. [cpp] view plain copy //利用指针数组存放单位矩阵 #include <iostream> using namespace std; void main() { int line1[]={1,0,0}; //声明数组,矩阵的第一行 int line2[]={0,1,0}; //声明数组,矩阵的第二行 int line3[]={0,0,1}; //声明数组.矩阵的第

const int *a和int *const a的区别

关键问题点:const 属于修饰符 ,关键是看const 修饰的位置在那里1.const int *a 这里const 修饰的是int,而int定义的是一个整值 因此*a 所指向的对象 值 不能通过 *a 来修改,但是 可以重新给 a 来赋值,使其指向不同的对象 eg:        const int *a = 0;        const int b = 1;        int c = 1;       a = &b  //  额外:注意不能通过a 来修改 b值       a = &a

int *p,cons int *p,int const *p,int * const p,const int * const p,int const * const p的区别

 加有const关键字的几种情况的辨析 const修饰的代码 含义(特点) 等价性 int *p = &num; 1.       可以读自己 2.       可以通过*p改自己 3.       可以通过p = &data来看别人 权限最大 cons int *p = &num; 1.const放在左边意味着指向的是常量,这个常量不可以修改, 2.p = &data; (地址可以修改) 3.*p = 30;(这个时候是错误的) 这两者等价(应用:查看别人的账户) i

int *p,cons int *p,int const *p,int * const p,const int * const p,int const * const p的差别

?? 加有constkeyword的几种情况的辨析 const修饰的代码 含义(特点) 等价性 int *p = &num; 1.       能够读自己 2.       能够通过*p改自己 3.       能够通过p = &data来看别人 权限最大 cons int *p = &num; 1.const放在左边意味着指向的是常量.这个常量不能够改动, 2.p = &data; (地址能够改动) 3.*p = 30;(这个时候是错误的) 这两者等价(应用:查看别人的账

C++ char*,const char*,string,int 的相互转换

C++ char*,const char*,string,int 的相互转换 1. string转const char* string s ="abc";const char* c_s = s.c_str(); 2. const char*转string 直接赋值即可 const char* c_s ="abc";string s(c_s); 3. string转char* string s ="abc";char* c;constint len

喜闻乐见的const int *p、int* const p、const int* const p

不废话直接代码示例: 1 void f(const int *p) { 2 3 int b = 10; 4 5 *p = 10; // error 6 7 p = &b; // fine 8 9 } 10 11 void f(int* const p) { 12 13 int b = 10; 14 15 *p = 10; // fine 16 17 p = &b; // error 18 19 } 20 21 void f(const int* const p) { 22 23 int b

int sprintf_s(char *,size_t,const char *,...)”: 不能将参数 2 从“const char [3]”转换为“size_t”

2014-03-02 20:14 在编译下列代码时,出现以下错误: cpp(23) : error C2664: “int sprintf_s(char *,size_t,const char *,...)”: 不能将参数 2 从“const char [3]”转换为“size_t” 请问这是什么意思?该怎么修改? #include<iostream> #include<string> #include<stdio.h> using namespace std; str

x86_64 xercexc: error: cast from &#39;const void*&#39; to &#39;long int&#39; loses precision [-fpermissive]

mingw编译x86_64版本xerces-c-2.8.0: 修改src/xercesc/util/HashPtr.cpp: unsigned int HashPtr::getHashVal(const void *const key, unsigned int mod , MemoryManager* const) { return ((long long)key % (unsigned long)mod); } 修改src/xercesc/internal/XSerializeEngine.