程式設計正規化和控制權轉移之間的關係
阿新 • • 發佈:2021-12-09
一、概述
指標是一個變數,其值為另一個變數的地址
舉例:
#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; }
五、從函式返回指標
後續補充