一直因為C++指針燒腦,所以一直可以逃避這c++,但時最近有空并且感覺學習很多C++有點繞不過去,所以抱著最少能看懂程序的要求來學習C++,基本知識跟別的語言大同小異,但是指針確實看的一知半解,所以記錄一下提高自己,順便幫助需要的人。
指針是一個變量,其值為另一個變量的地址,即內存位置的直接地址。就像其他變量或常量一樣,您必須在使用指針存儲其他變量地址之前,對其進行聲明。指針變量聲明的一般形式為:
type *var-name;
type 是指針的基類型,它必須是一個有效的 C++ 數據類型,var-name 是指針變量的名稱,星號是用來指定一個變量是指針,通過 * 來返回位于操作數所指定地址的變量的值。使用連字號(&)運算符加上指針變量來訪問內存地址。以下是有效的指針聲明:
int *ip; /* 一個整型的指針 */
double *dp; /* 一個 double 型的指針 */
float *fp; /* 一個浮點型的指針 */
char *ch; /* 一個字符型的指針 */
所有指針的值的實際數據類型,不管是整型、浮點型、字符型,還是其他的數據類型,都是一樣的,都是一個代表內存地址的長的十六進制數。不同數據類型的指針之間唯一的不同是,指針所指向的變量或常量的數據類型不同。
使用指針時操作步驟:定義一個指針變量、把變量地址賦值給指針、訪問指針變量中可用地址的值。
實例如下:
#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;
}
當上面的代碼被編譯和執(zhí)行時,它會產生下列結果:
Value of var variable: 20
Address stored in ip variable: 0xbfc601ac
Value of *ip variable: 20
指針運算:
指針是一個用數值表示的地址。因此,您可以對指針執(zhí)行算術運算。可以對指針進行四種算術運算:++、--、+、-。
假設 ptr 是一個指向地址 1000 的整型指針,是一個 32 位的整數,讓我們對該指針執(zhí)行下列的算術運算:
ptr++
在執(zhí)行完上述的運算之后,ptr 將指向位置 1004,因為 ptr 每增加一次,它都將指向下一個整數位置,即當前位置往后移 4 個字節(jié)。這個運算會在不影響內存位置中實際值的情況下,移動指針到下一個內存位置。如果 ptr 指向一個地址為 1000 的字符,上面的運算會導致指針指向位置 1001,因為下一個字符位置是在 1001。
我們喜歡在程序中使用指針代替數組,因為變量指針可以遞增,而數組不能遞增,因為數組是一個常量指針。下面的程序遞增變量指針,以便順序訪問數組中的每一個元素:
實例如下:
#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;
}
當上面的代碼被編譯和執(zhí)行時,它會產生下列結果:
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
遞減指針如下:
#include <iostream>
using namespace std;
const int MAX = 3;
int main ()
{
int var[MAX] = {10, 100, 200};
int *ptr;
// 指針中最后一個元素的地址
ptr = &var[MAX-1];
for (int i = MAX; i > 0; i--)
{
cout << "Address of var[" << i << "] = ";
cout << ptr << endl;
cout << "Value of var[" << i << "] = ";
cout << *ptr << endl;
// 移動到下一個位置
ptr--;
}
return 0;
}
當上面的代碼被編譯和執(zhí)行時,它會產生下列結果:
Address of var[3] = 0xbfdb70f8
Value of var[3] = 200
Address of var[2] = 0xbfdb70f4
Value of var[2] = 100
Address of var[1] = 0xbfdb70f0
Value of var[1] = 10
指針數組:
指針和數組是密切相關的。事實上,指針和數組在很多情況下是可以互換的。例如,一個指向數組開頭的指針,可以通過使用指針的算術運算或數組索引來訪問數組
而指針數組,我們讓數組存儲指向 int 或 char 或其他數據類型的指針,聲明如下:
int *ptr[MAX];
在這里,把 ptr 聲明為一個數組,由 MAX 個整數指針組成。因此,ptr 中的每個元素,都是一個指向 int 值的指針。下面的實例用到了三個整數,它們將存儲在一個指針數組中,如下所示
#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;
}
當上面的代碼被編譯和執(zhí)行時,它會產生下列結果:
Value of var[0] = 10
Value of var[1] = 100
Value of var[2] = 200
也可以用一個指向字符的指針數組來存儲一個字符串列表,如下:
#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;
}
當上面的代碼被編譯和執(zhí)行時,它會產生下列結果:
Value of names[0] = Zara Ali
Value of names[1] = Hina Ali
Value of names[2] = Nuha Ali
Value of names[3] = Sara Ali
覺得重要的知識點,暫時就總結到這些,倒數第二個實例不知道是不是有更好更簡便的方法,還是最后一個實例中什么時候需要const (調試時發(fā)現(xiàn)沒有const就會報錯)。歡迎大家評論區(qū)留言和交流