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