1. 程式人生 > 其它 >程式設計正規化和控制權轉移之間的關係

程式設計正規化和控制權轉移之間的關係

一、概述
指標是一個變數,其值為另一個變數的地址
舉例:

#include <iostream>

using namespace std;

int main ()
{
int var = 20; // 實際變數的宣告
int *ip; // 指標變數的宣告

ip = &var; // 在指標變數中儲存 var 的地址

cout << "Value of var variable: ";
cout << var << endl;

// 輸出在指標變數中儲存的地址
cout << "Address stored in ip variable: 
"; cout << ip << endl; // 訪問指標中地址的值 cout << "Value of *ip variable: "; cout << *ip << endl; return 0; }

在變數宣告的時候,如果沒有確切的地址可以賦值,為指標變數賦一個 NULL 值是一個良好的程式設計習慣。

賦為 NULL 值的指標被稱為指標。NULL 指標是一個定義在標準庫中的值為零的常量。

例項:

#include <iostream>

using namespace std;

int main ()
{
   
int *ptr = NULL; cout << "ptr 的值是 " << ptr ; return 0; }

當上面的程式碼被編譯和執行時,它會產生下列結果:

ptr 的值是 0

二、C++指標算術運算

指標是一個用數值表示的地址。因此,您可以對指標執行算術運算。可以對指標進行四種算術運算:++、--、+、-

如:

假設ptr是一個指向地址 1000 的整型 int指標

ptr++

ptr將指向位置 1004,因為 ptr 每增加一次,它都將指向下一個整數位置,即當前位置往後移 4 個位元組

假設ptr指向一個地址為 1000 的字元 char

上面的運算會導致指標指向位置 1001,因為下一個字元位置是在 1001

1.遞增一個指標

例如:

#include <iostream>
 
using namespace std;
const int MAX = 3;
 
int main ()
{
   int  var[MAX] = {10, 100, 200};
   int  *ptr;
 
   // 指標中的陣列地址
   ptr = var;
   for (int i = 0; i < MAX; i++)
   {
      cout << "Address of var[" << i << "] = ";
      cout << ptr << endl;
 
      cout << "Value of var[" << i << "] = ";
      cout << *ptr << endl;
 
      // 移動到下一個位置
      ptr++;
   }
   return 0;
}

當上面的程式碼被編譯和執行時,它會產生下列結果:

Address of var[0] = 0xbfa088b0
Value of var[0] = 10
Address of var[1] = 0xbfa088b4
Value of var[1] = 100
Address of var[2] = 0xbfa088b8
Value of var[2] = 200

2. 遞減一個指標

同理

3.指標的比較

指標可以用關係運算符進行比較,如 ==、< 和 >。如果 p1 和 p2 指向兩個相關的變數,比如同一個數組中的不同元素,則可對 p1 和 p2 進行大小比較

例如:

只要變數指標所指向的地址小於或等於陣列的最後一個元素的地址 &var[MAX - 1],則把變數指標進行遞增

#include <iostream>
 
using namespace std;
const int MAX = 3;
 
int main ()
{
   int  var[MAX] = {10, 100, 200};
   int  *ptr;
 
   // 指標中第一個元素的地址
   ptr = var;
   int i = 0;
   while ( ptr <= &var[MAX - 1] )
   {
      cout << "Address of var[" << i << "] = ";
      cout << ptr << endl;
 
      cout << "Value of var[" << i << "] = ";
      cout << *ptr << endl;
 
      // 指向上一個位置
      ptr++;
      i++;
   }
   return 0;
}

三、C++指標陣列

1. 指向整數的指標陣列

例項:

#include <iostream>
 
using namespace std;
const int MAX = 3;
 
int main ()
{
   int  var[MAX] = {10, 100, 200};
   int *ptr[MAX];
 
   for (int i = 0; i < MAX; i++)
   {
      ptr[i] = &var[i]; // 賦值為整數的地址
   }
   for (int i = 0; i < MAX; i++)
   {
      cout << "Value of var[" << i << "] = ";
      cout << *ptr[i] << endl;
   }
   return 0;
}

當上面的程式碼被編譯和執行時,它會產生下列結果:

Value of var[0] = 10
Value of var[1] = 100
Value of var[2] = 200

2.指向字元的指標陣列

例項:

#include <iostream>
 
using namespace std;
const int MAX = 4;
 
int main ()
{
 const char *names[MAX] = {
                   "Zara Ali",
                   "Hina Ali",
                   "Nuha Ali",
                   "Sara Ali",
   };
 
   for (int i = 0; i < MAX; i++)
   {
      cout << "Value of names[" << i << "] = ";
      cout << names[i] << endl;
   }
   return 0;
}

當上面的程式碼被編譯和執行時,它會產生下列結果:

Value of names[0] = Zara Ali
Value of names[1] = Hina Ali
Value of names[2] = Nuha Ali
Value of names[3] = Sara Ali

四、C++傳遞指標給函式

C++ 允許傳遞指標給函式,只需要宣告函式引數為指標型別即可

例項:

交換兩個值的函式

#include <iostream>
using namespace std;
 
void swap(int *p1, int *p2)
{
    int p;
    p = *p1;
    *p1 = *p2;
    *p2 = p;
    
}
 
int main()
{
    int a, b;
    int *p, *q;
    cin >> a >> b;
    p = &a;
    q = &b;
    
    swap(p, q);
    cout<< a << " "<< b;
}

五、從函式返回指標

後續補充