深入const int *p與int * const p的區(qū)別詳解(常量指針與指向常量的指針)
更新時(shí)間:2013年06月04日 11:19:30 作者:
本篇文章是對(duì)const int *p與int * const p的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
對(duì)于指針和常量,有以下三種形式都是正確的:
const char * myPtr = &char_A;//指向常量的指針
char * const myPtr = &char_A;//常量的指針
const char * const myPtr = &char_A;//指向常量的常量指針
下面依次對(duì)這三種類型進(jìn)行介紹。
因?yàn)?操作符是左操作符,左操作符的優(yōu)先級(jí)是從右到左,對(duì)于
1.常量指針(Constant Pointers)
int * const p
先看const再看* ,是p是一個(gè)常量類型的指針,不能修改這個(gè)指針的指向,但是這個(gè)指針?biāo)赶虻牡刂飞洗鎯?chǔ)的值可以修改。
實(shí)例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不能再這樣重新賦值了,即不能再指向另一個(gè)新地址。所以我已經(jīng)注釋了它。
printf("%d\n", *pi ) ; //輸出是30
i1=80; //5.想想看:這里能用*pi=80;來代替嗎?可以,這里可以通過*pi修改i1的值。
printf("%d\n", *pi ) ; //輸出是80
system("pause");
}
實(shí)例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,定義一個(gè)指針指向一個(gè)常量,不能通過指針來修改這個(gè)指針指向的值。
實(shí)例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可以在任意時(shí)候重新賦值一個(gè)新內(nèi)存地址
i2=80; //想想看:這里能用*pi=80;來代替嗎?當(dāng)然不能
printf("%d\n", *pi ) ; //輸出是80
system("pause");
}
實(shí)例4
char char_A = 'A';
const char * myPtr = &char_A;
*myPtr = 'J'; // error - can't change value of *myPtr
所以指針p所指向的整型數(shù)是一個(gè)常量,其值不能被修改。
3.指向常量的常量指針
對(duì)于“指向常量的常量指針”,就必須同時(shí)滿足上述1和2中的內(nèi)容,既不可以修改指針的值,也不可以修改指針指向的值。
4.引入字符數(shù)組和字符指針
字符數(shù)組和字符指針的定義如下:
char a[] = "I Love You!"; //定義了一個(gè)字符數(shù)組
char *p = "I Love You!"; //定義了一個(gè)字符指針
可以將a理解為常量指針,而p為指向常量的指針,代碼實(shí)例如下:
#include<iostream>
#include<stdlib.h>
using namespace std;
void main()
{
char a[] = "I Love You!"; //定義了一個(gè)字符數(shù)組,數(shù)組名a是一個(gè)常量指針,指向的位置不變,都是數(shù)組第一個(gè)元素的位置
char *p = "I Love You!"; //定義了一個(gè)字符指針,指針p指向一個(gè)字符串常量,這個(gè)字符串常量不能修改
//*(p+1)='a';//錯(cuò)誤,不可以修改指針指向的值,所以這里注釋掉。
a[1]='a';//常量指針,不能修改指針的值,但是可以修改指針?biāo)赶虻闹怠?BR> //a=p;//錯(cuò)誤,a是常量指針,不可修改其值。
cout<<a<<endl;
cout<<p<<endl;
cout<<a[1]<<endl;
cout<<*(p+2)<<endl;
system("pause");
}
輸出值為:
IaLove You!
I Love You!
a
L
復(fù)制代碼 代碼如下:
const char * myPtr = &char_A;//指向常量的指針
char * const myPtr = &char_A;//常量的指針
const char * const myPtr = &char_A;//指向常量的常量指針
下面依次對(duì)這三種類型進(jìn)行介紹。
因?yàn)?操作符是左操作符,左操作符的優(yōu)先級(jí)是從右到左,對(duì)于
1.常量指針(Constant Pointers)
復(fù)制代碼 代碼如下:
int * const p
先看const再看* ,是p是一個(gè)常量類型的指針,不能修改這個(gè)指針的指向,但是這個(gè)指針?biāo)赶虻牡刂飞洗鎯?chǔ)的值可以修改。
實(shí)例1:
復(fù)制代碼 代碼如下:
#include<iostream>
#include<stdlib.h>
using namespace std;
void main()
{
int i1=30;
int i2=40;
int * const pi=&i1;//這里的pi指針式常量。
//pi=&i2; //注意這里,pi不能再這樣重新賦值了,即不能再指向另一個(gè)新地址。所以我已經(jīng)注釋了它。
printf("%d\n", *pi ) ; //輸出是30
i1=80; //5.想想看:這里能用*pi=80;來代替嗎?可以,這里可以通過*pi修改i1的值。
printf("%d\n", *pi ) ; //輸出是80
system("pause");
}
實(shí)例2:
復(fù)制代碼 代碼如下:
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)
復(fù)制代碼 代碼如下:
const int *p
先看*再看const,定義一個(gè)指針指向一個(gè)常量,不能通過指針來修改這個(gè)指針指向的值。
實(shí)例3:
復(fù)制代碼 代碼如下:
#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可以在任意時(shí)候重新賦值一個(gè)新內(nèi)存地址
i2=80; //想想看:這里能用*pi=80;來代替嗎?當(dāng)然不能
printf("%d\n", *pi ) ; //輸出是80
system("pause");
}
實(shí)例4
復(fù)制代碼 代碼如下:
char char_A = 'A';
const char * myPtr = &char_A;
*myPtr = 'J'; // error - can't change value of *myPtr
所以指針p所指向的整型數(shù)是一個(gè)常量,其值不能被修改。
3.指向常量的常量指針
對(duì)于“指向常量的常量指針”,就必須同時(shí)滿足上述1和2中的內(nèi)容,既不可以修改指針的值,也不可以修改指針指向的值。
4.引入字符數(shù)組和字符指針
字符數(shù)組和字符指針的定義如下:
復(fù)制代碼 代碼如下:
char a[] = "I Love You!"; //定義了一個(gè)字符數(shù)組
char *p = "I Love You!"; //定義了一個(gè)字符指針
可以將a理解為常量指針,而p為指向常量的指針,代碼實(shí)例如下:
復(fù)制代碼 代碼如下:
#include<iostream>
#include<stdlib.h>
using namespace std;
void main()
{
char a[] = "I Love You!"; //定義了一個(gè)字符數(shù)組,數(shù)組名a是一個(gè)常量指針,指向的位置不變,都是數(shù)組第一個(gè)元素的位置
char *p = "I Love You!"; //定義了一個(gè)字符指針,指針p指向一個(gè)字符串常量,這個(gè)字符串常量不能修改
//*(p+1)='a';//錯(cuò)誤,不可以修改指針指向的值,所以這里注釋掉。
a[1]='a';//常量指針,不能修改指針的值,但是可以修改指針?biāo)赶虻闹怠?BR> //a=p;//錯(cuò)誤,a是常量指針,不可修改其值。
cout<<a<<endl;
cout<<p<<endl;
cout<<a[1]<<endl;
cout<<*(p+2)<<endl;
system("pause");
}
輸出值為:
IaLove You!
I Love You!
a
L
您可能感興趣的文章:
相關(guān)文章
C++高級(jí)數(shù)據(jù)結(jié)構(gòu)之優(yōu)先隊(duì)列
這篇文章主要介紹了C++高級(jí)數(shù)據(jù)結(jié)構(gòu)之優(yōu)先隊(duì)列,文章圍繞主題的相關(guān)資料展開詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05
C++ 中pragma once 與 #ifndef _XXX_H_ #define _XXX_H_的區(qū)別
這篇文章主要介紹了C++ 中pragma once 與 #ifndef _XXX_H_ #define _XXX_H_的區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-04-04
詳解C++中stoi/stol/stoll函數(shù)的用法
這篇文章主要為大家詳細(xì)介紹了C++中stoi、stol、stoll函數(shù)的具體用法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)校C++有一點(diǎn)的幫助,需要的可以參考一下2023-03-03
C語言數(shù)組按協(xié)議存儲(chǔ)與按協(xié)議解析數(shù)據(jù)的實(shí)現(xiàn)
今天小編就為大家分享一篇關(guān)于C語言數(shù)組按協(xié)議存儲(chǔ)與按協(xié)議解析數(shù)據(jù)的實(shí)現(xiàn),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12
C++中std::invalid_argument報(bào)錯(cuò)解決
在C++編程中,std::invalid_argument是一個(gè)常見的異常,用于指示函數(shù)參數(shù)無效,文章詳細(xì)解析了這一異常的產(chǎn)生原因,并提供了多種解決策略,感興趣的可以了解一下2024-09-09
C++中memcpy和memmove的區(qū)別總結(jié)
這篇文章主要介紹了C++中memcpy和memmove的區(qū)別總結(jié),這個(gè)問題經(jīng)常出現(xiàn)在C++的面試題目中,需要的朋友可以參考下2014-10-10
c/c++獲取系統(tǒng)時(shí)間函數(shù)的方法示例
這篇文章主要介紹了c/c++獲取系統(tǒng)時(shí)間函數(shù)的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
C/C++實(shí)現(xiàn)對(duì)STORM運(yùn)行信息查看及控制的方法
這篇文章主要介紹了C/C++實(shí)現(xiàn)對(duì)STORM運(yùn)行信息查看及控制的方法,需要的朋友可以參考下2014-07-07

