天天看點

極智Coding | 講一講常量指針與指針常量

  ​

​歡迎關注我的公衆号 [極智視界],擷取我的更多筆記分享​

  大家好,我是極智視界,本文講解一下 常量指針與指針常量的用法。

  常量指針不能用于改變它指向的值,指針常量在初始化後就不能改變。

文章目錄

  • ​​1 常量指針​​
  • ​​2 指針常量​​
  • ​​3 指向常量的常指針​​
  • ​​4 示例​​
  • ​​4.1 示例一​​
  • ​​4.2 示例二​​
  • ​​4.3 示例三​​

1 常量指針

  如果作為形參傳入到函數中,其在函數内部是不能被修改的。

  常量指針定義:又叫常指針(常量的指針),即這是個指向常量的指針,這個常量是指針的值(位址),而不是位址指向的值。

  關鍵點:

  • 常量指針指向的對象不能通過這個指針來修改,可是仍然可以通過原來的聲明修改;
  • 常量指針可以被指派為變量的位址,之是以叫常量指針,是限制了通過這個指針修改變量的值;
  • 指針還可以指向别處,因為指針本身隻是個變量,可以指向任意位址。

  代碼形式:

資料類型 const 指針變量;
const 資料類型 指針變量;      

2 指針常量

  指針常量定義:本質是一個常量,而用指針修飾它。指針常量的值是指針,這個值因為是常量,是以不能被指派。

  關鍵點:

  • 它是個常量;
  • 指針所儲存的位址可以改變,然而指針所指向的值卻不可以改變;
  • 指針本身是常量,指向的位址不可以變化,但是指向的位址所對應的内容可以變化。
  • 使用前要初始化

  代碼形式:

資料類型* const 指針變量;      

3 指向常量的常指針

  指向常量的常指針定義:指向常量的指針常量就是一個常量,且它指向的對象也是一個常量。

  關鍵點:

  • 一個指針常量,指向的是一個指針對象;
  • 它指向的指針對象且是一個常量,即它指向的對象不能變化。

  代碼形式:

const 資料類型* const 指針變量;
資料類型 const * const 指針變量;      

4 示例

4.1 示例一

#include <iostream>

using namespace std;

int main()
{
  /// 常量指針
  int a;
  const int *p1 = &a;
  a = 300;
  //*p1 = 56;    // 錯誤,*p1是const int的,不可修改,即常量指針不可修改其指向的内容
  int b = 200;
  p1 = &b;  // 指針可以修改
  
  /// 指針常量
  int* const p2 = &a;
  a = 500;   // 可以通過原來的聲明修改值
  *p2 = 400;  // 指針是常量,指向的位址不可以變化,但是指向的位址所對應的内容是可以變化的
  //p2 = &b;   // 錯誤,因為p2是const指針,是以不能改變p2指向的位址
  
  /// 指向常量的常量指針
  const int* const p3 = &a;
  //*p3=1;   // 錯誤
  //p3=&b;   // 錯誤
  a = 600;   // 可以通過原來的聲明修改值
}      

4.2 示例二

#include <iostream>

using namespace std;

int main()
{
  int a = 3;
  int b = 1;
  int c = 2;
  int const *p1 = &b;
  int *const p2 = &c;
  cout << "old vars and pointer's address: " << endl;
  cout << "&a = " << &a << "a = " << a << endl;
  cout << "&b = " << &b << "&c = " << &c << "b = " << b << "c = " << c << endl;
  cout << "p1 = " << p1 << "p2 = " << p2 << "*p1 = " << *p1 << "*p2 = " << endl << endl;
  
  p1 = &a;
  b = 11;
  cout <<"the address and values of const pointer: " << endl;
  cout << "p1 = " << p1 << "*p1 = " << *p1 << endl << endl;
  
  c = 22;
  *p2 = c;
  cout << "the address and values of const pointer: " << endl;
  cout << "p2 = " << p2 <<"*p2 = " << *p2 << endl << endl;
  
  return 0;
}      
極智Coding | 講一講常量指針與指針常量

  從輸出結果可以看出,對于常量指針 p1,改變其位址指向,内容也随着位址的改變而變化了;對于指針常量 p2,初始化後位址就固定了,内容可以随時重新指派。

  對于常量指針 p1,可以改變它指向的位址,但不能改變指向的内容;對于對于指針常量 p2,可以改變它指向位址的内容,卻不能改變它指向的位址。

4.3 示例三

#include <iostream>
#include <iomanip>

using namespace std;

const int SIZE = 6;
const double payRates[SIZE] = {18.55, 17.45, 12.85, 14.97, 10.35, 18.89};
const double PAY[SIZE] = {17.2, 11.4, 14.56, 39.12, 28.45, 55.77};

void displayPayRates(const double *rates, int size)
{
  cout << *rates << endl;
  rates = PAY;
  cout << *rates << endl;
  cout << setprecision(2) << fixed << showpoint;
  
  for(int count = 0; count < size; count++)
  {
    cout << rates + count << endl;
    cout << "Pay rate for employee " << (count + 1) << " is $ " << *(rates + count) << endl; endl;
  }
}

int main()
{
  cout <<"this is payRates's address " << &payRates << endl;
  cout << "this is PAY's addtess " << &PAY << endl;
  displayPayRates(payRates, SIZE);
}      
極智Coding | 講一講常量指針與指針常量

  以上 要注意三點:

  • 作為固定形參的輸入 const double *rates,其在 displayPayRates 函數内部不能被重新指派,即不能出現類似于 rates[0] = 12.56 等這樣的代碼,但可以出現 rates = &PAY[SIZE] 和 rates = PAY 的代碼;
  • rates 最初表示 payRates 常量首位址,其每加 1 則位址向後移動 8 個位元組,因為 double 類型占 8 個位元組
  • displayPayRates 函數的形參中一定要包含 const 關鍵字,否則會産生編譯器報錯。

  好了,以上分享了 常量指針與指針常量的用法。希望我的分享能對你的學習有一點幫助。

極智Coding | 講一講常量指針與指針常量

繼續閱讀