發(fā)布于:2021-01-28 13:40:31
0
208
0
什么是指針?
在C++中,指針是指保存另一變量地址的變量。與正則變量一樣,指針也有數(shù)據(jù)類型。例如,整型指針可以保存整型變量的地址。字符型指針可以保存字符型變量的地址。
您應(yīng)該將指針視為內(nèi)存地址的符號(hào)表示。通過指針,程序可以通過引用模擬調(diào)用。它們還可以創(chuàng)建和操作動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)。在C++中,指針變量是指指向另一變量指向的內(nèi)存中的特定地址的變量。
C++中的地址
為了理解C++指針,必須了解計(jì)算機(jī)如何存儲(chǔ)數(shù)據(jù)。
當(dāng)你在C++程序中創(chuàng)建變量時(shí),它會(huì)給計(jì)算機(jī)內(nèi)存分配一些空間。此變量的值存儲(chǔ)在指定的位置。
為了知道數(shù)據(jù)存儲(chǔ)在計(jì)算機(jī)內(nèi)存中的位置,C ++提供了&(引用)運(yùn)算符。操作員返回變量占用的地址。
例如,如果x是變量,&x返回變量的地址。
指針聲明語法
C++聲明采用以下語法:
datatype *variable_name;
數(shù)據(jù)類型是指針的基本類型,必須是有效的C ++數(shù)據(jù)類型。
variable_name是指針變量的名稱。
上面用于指針聲明的星號(hào)類似于用于執(zhí)行乘法運(yùn)算的星號(hào)。星號(hào)將變量標(biāo)記為指針。
這是C++中有效指針聲明的一個(gè)例子:
int *x; // a pointer to integer
double *x; // a pointer to double
float *x; // a pointer to float
char *ch // a pointer to a character
引用運(yùn)算符(&;)返回變量的地址。
解引用運(yùn)算符(*)幫助我們獲取存儲(chǔ)在內(nèi)存地址中的值。
例如:
如果我們有一個(gè)名為num的變量,存儲(chǔ)在地址0x234中,并存儲(chǔ)值28。
引用運(yùn)算符(&;)將返回0x234。
解引用運(yùn)算符(*)將返回5。
#include <iostream>
int main() {
int x = 27;
int *ip;
ip = &x;
cout << "Value of x is : ";
cout << x << endl;
cout << "Value of ip is : ";
cout << ip<< endl;
cout << "Value of *ip is : ";
cout << *ip << endl;
return 0;
}
輸出:
工作原理:
以下是代碼截圖:
代碼說明:
導(dǎo)入iostream頭文件。這將允許我們使用頭文件中定義的函數(shù)而不會(huì)出錯(cuò)。
包含std名稱空間以使用其類而不調(diào)用它。
調(diào)用main()函數(shù)。程序邏輯應(yīng)添加在此函數(shù)體中。{標(biāo)記函數(shù)體的開始。
聲明一個(gè)整數(shù)變量x并將其賦值為27。
聲明指針變量*ip。
將變量x的地址存儲(chǔ)在指針變量中。
在控制臺(tái)上打印一些文本。
在屏幕上打印變量x的值。
在控制臺(tái)上打印一些文本。
打印變量x的地址。地址值存儲(chǔ)在變量ip中。
在控制臺(tái)上打印一些文本。
打印存儲(chǔ)在指針地址的值。
程序成功執(zhí)行后應(yīng)返回值。
main()函數(shù)主體的結(jié)尾。
數(shù)組和指針基于相關(guān)概念工作。在使用具有指針的數(shù)組時(shí),需要注意的事情不盡相同。數(shù)組名稱本身表示數(shù)組的基址。這意味著要將數(shù)組地址分配給指針,不應(yīng)使用與號(hào)(&;)。
例如:
p = arr;
以上是正確的,因?yàn)閍rr表示數(shù)組的地址。下面是另一個(gè)例子:
p = &arr;
以上不正確。
我們可以隱式地將數(shù)組轉(zhuǎn)換為指針。例如:
int arr [20];
int * ip;
以下是有效操作:
ip = arr;
在上述聲明之后,ip和arr將是等價(jià)的,并且它們將共享屬性。但是,可以將不同的地址分配給ip,但我們不能將任何內(nèi)容分配給arr
此示例演示如何使用指針遍歷數(shù)組:
#include <iostream>
int main() {
int *ip;
int arr[] = { 10, 34, 13, 76, 5, 46 };
ip = arr;
for (int x = 0; x < 6; x++) {
cout << *ip << endl;
ip++;
}
return 0;
}
輸出:
以下是代碼截圖:
代碼說明:
聲明整數(shù)指針變量ip。
聲明一個(gè)名為arr的數(shù)組,并在其中存儲(chǔ)6個(gè)整數(shù)。
將arr分配給ip。ip和arr將變得等效。
創(chuàng)建for循環(huán)。創(chuàng)建循環(huán)變量x是為了迭代索引0到5的數(shù)組元素。
打印存儲(chǔ)在指針I(yè)P地址的值。每次迭代將返回一個(gè)值,總共重復(fù)6次。Endl是一個(gè)C++的關(guān)鍵字,它是結(jié)束線。此操作允許您在打印每個(gè)值后將光標(biāo)移動(dòng)到下一行。每個(gè)值將打印在一行中。
在每次迭代后將指針移動(dòng)到下一個(gè)int位置。
循環(huán)結(jié)束。
程序必須在成功執(zhí)行時(shí)返回某些內(nèi)容。
main()函數(shù)體的結(jié)尾。
如果沒有要分配的確切地址,則可以為指針變量分配NULL。應(yīng)該在申報(bào)的時(shí)候做。這種指針稱為空指針。它的值為零,并且在許多標(biāo)準(zhǔn)庫(如iostream)中定義。
#include <iostream>
int main() {
int *ip = NULL;
cout << "Value of ip is: " << ip;
return 0;
}
輸出:
以下是代碼截圖:
代碼說明:
聲明指針變量ip并為其賦值NULL。
在控制臺(tái)上打印指針變量ip的值和一些文本。
程序成功完成后必須返回值。
main()函數(shù)主體的結(jié)尾。
C++,可以直接從計(jì)算機(jī)的內(nèi)存中操作數(shù)據(jù)。
可以根據(jù)需要分配或重新分配存儲(chǔ)空間。這是通過指針變量實(shí)現(xiàn)的。
指針變量指向計(jì)算機(jī)內(nèi)存中由另一個(gè)變量指向的特定地址。
可聲明如下:
int *p;
或者
int* p;
在you示例中,我們聲明了指針變量p
它將保存一個(gè)內(nèi)存地址。
星號(hào)是解引用運(yùn)算符,表示指向的指針。
指針p指向內(nèi)存地址中的整數(shù)值。
#include <iostream>
int main() {
int *p, x = 30;
p = &x;
cout << "Value of x is: " << *p;
return 0;
}
輸出:
以下是代碼截圖:
代碼說明:
聲明一個(gè)指針變量p和一個(gè)值為30的變量x。
將變量x的地址指定給p。
在控制臺(tái)上打印指針變量p的值和一些文本。
程序成功完成后必須返回值。
main()函數(shù)主體的結(jié)尾。
<> C++中的函數(shù)只能返回一個(gè)值。此外,函數(shù)中聲明的所有變量都在函數(shù)調(diào)用堆棧中分配。一旦函數(shù)返回,所有堆棧變量都將被銷毀。
函數(shù)的參數(shù)是通過值傳遞的,對(duì)變量所做的任何修改都不會(huì)改變傳遞的實(shí)際變量的值。下面的例子有助于說明這一點(diǎn)概念:-
例5:
#includeusing namespace std;
void test(int*, int*);
int main() {
int a = 5, b = 5;
cout << "Before changing:" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
test(&a, &b);
cout << "nAfter changing" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
void test(int* n1, int* n2) {
*n1 = 10;
*n2 = 11;
}
輸出:
以下是代碼截圖:
代碼說明:
創(chuàng)建一個(gè)名為test的函數(shù)原型,該函數(shù)將接受兩個(gè)整數(shù)參數(shù)。
調(diào)用main()函數(shù)。我們將在其主體中添加程序邏輯。
聲明兩個(gè)整型變量a和b,每個(gè)變量的值為5。
在控制臺(tái)上打印一些文本。endl(結(jié)束行)將移動(dòng)光標(biāo)開始下一行的打印。
在控制臺(tái)上將變量a的值與其他文本一起打印。endl(結(jié)束行)將移動(dòng)光標(biāo)開始下一行的打印。
在控制臺(tái)上打印變量b的值和其他文本。endl(結(jié)束行)將移動(dòng)光標(biāo)開始下一行的打印。
創(chuàng)建一個(gè)名為test()的函數(shù),將變量a和b的地址作為參數(shù)。
在控制臺(tái)上打印一些文本。在打印文本之前,| n將創(chuàng)建一個(gè)新的空行。文本打印后,endl(結(jié)束行)將移動(dòng)光標(biāo)開始下一行的打印。
在控制臺(tái)上將變量a的值與其他文本一起打印。endl(結(jié)束行)將移動(dòng)光標(biāo)開始下一行的打印。
在控制臺(tái)上打印變量b的值和其他文本。endl(結(jié)束行)將移動(dòng)光標(biāo)開始下一行的打印。
程序成功完成后必須返回值。
main()函數(shù)主體的結(jié)尾。
定義函數(shù)test()。函數(shù)應(yīng)該采用兩個(gè)整數(shù)指針變量*n1和*n2。
將指針變量*n1賦值為10。
將指針變量*n2賦值為11。
函數(shù)測(cè)試()正文結(jié)束。
即使在函數(shù)測(cè)試中為變量a和b分配了新的值,但一旦函數(shù)調(diào)用完成,外部函數(shù)main也不會(huì)反映出相同的值。
使用指針作為函數(shù)參數(shù)有助于在函數(shù)中傳遞變量的實(shí)際地址,對(duì)變量執(zhí)行的所有更改都將反映在外部函數(shù)中。
在上述情況下,函數(shù)“test”具有變量“a”和“b”的地址。這兩個(gè)變量可以從函數(shù)“test”直接訪問,因此對(duì)這些變量所做的任何更改都會(huì)反映在調(diào)用方函數(shù)“main”中
下面是使用指針的優(yōu)點(diǎn)/好處
指針是存儲(chǔ)C++中其他變量地址的變量。
函數(shù)可以使用指針修改和返回多個(gè)變量。
可以使用指針動(dòng)態(tài)分配和取消分配內(nèi)存。
指針有助于簡(jiǎn)化程序的復(fù)雜性。
使用指針可以提高程序的執(zhí)行速度。
指針是指保存另一個(gè)變量地址的變量。
每個(gè)指針都有一個(gè)有效的數(shù)據(jù)類型。
指針是內(nèi)存地址的符號(hào)表示。
指針允許程序模擬引用調(diào)用,并創(chuàng)建和操作動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)。
數(shù)組和指針使用相關(guān)概念。
數(shù)組名稱表示數(shù)組的基。
如果要將數(shù)組地址分配給指針,請(qǐng)不要使用與號(hào)(&;)。
如果沒有指定的地址來指定指針變量,請(qǐng)將其指定為NULL。
作者介紹
熱門博客推薦