指標(pointer)是c語言中乙個重點和難點,以下是對其基本使用的一些總結,適合入門的同學。除了是對自己的學習的總結之外,也希望能對大家有所幫助。
與c語言其他變數類似,指標也是一種變數,只不過它與其他變數不同,一般變數是直接包含了乙個特定的值,而指標是包含了乙個變數的值所在的位址,也就是說,指標儲存了乙個變數的位址,間接地指向乙個值。
與一般的變數一樣,指標在使用之前也必須定義:
int
*countptr;
以上語句定義了乙個int *
型別的變數countptr,表示countptr是乙個指向int型別變數值的指標。這樣,countptr變數將儲存乙個位址,這個位址是另乙個int變數所在的位址。
這裡需要注意的乙個點是,當乙個定義語句有幾個變數時,每個變數前都必須加上*
,如:
int
*countptr,
*anotherptr;
// int *countptr, count; // 這樣定義也是合法的,不會報錯,但第二個count是int型別的變數,可能會導致邏輯錯誤,必須注意
乙個指標必須在定義時或者在賦值語句中初始化,可以初始化成0,null或者乙個變數的位址。0,null表示指標不指向任何東西(推薦使用null,因為使用0時還得進行型別轉換)。後文討論如何將變數的位址賦值給乙個指標。
int x =3;
int*xptr;
xptr =
&x;
以上操作將變數x的位址賦值給了指標變數xptr,這樣就說指標變數xptr指向了變數x。
*
,間接引用運算元,返回其運算元(必須是乙個指標變數)指向的變數的值。例如:
printf
("%d"
,*xptr)
;
以上操作列印出了xptr指向的變數x的值,即3。
我們考慮乙個交換兩個數的函式:
void
swap
(int a,
int b)
intmain()
這似乎沒有問題,但當測試之後,發現a和b並沒有交換。
這是為什麼呢?因為swap函式的兩個引數,是按值傳遞的,以實參num1把自身的值傳遞給了形參a,a和num1是兩個變數,只是他們的值相同而已,之後a的變化與num1並沒有關係,且此函式中的變數在函式執行完畢之後都會被銷毀,所以swap中進行的操作,並不會影響到外面,這樣自然就不會產生希望看到的效果。
那要怎麼實現交換兩個數的函式呢?這可以通過指標來實現。
將以上**修改為:
void
swap
(int
* a,
int* b)
intmain()
注意這裡的兩個引數型別都變成了指標,且實參使用了取位址符&
,這樣引數就變成了按引用傳遞。我們同樣按以上的方式進行分析。&num1
將num1的位址傳遞給了指標變數a,這樣指標變數a就指向了num1的值,當使用*a = *b
對其進行操作時,就間接改變了num1的值,num2同理。
用const修飾的變數表示常量,即一旦初始化之後不可再次更改。可以使用const修飾符對指標變數進行修飾,但放在不同位置中表示不同的含義。如:
sizeof 是乙個編譯時的操作符,可以操作變數名,型別或者值,計算位元組數。
注意其對陣列、指標和一般變數的差別。
(以下用了c++語法,可不用在意,只需看sizeof部分)
#include
using
namespace std;
intmain()
可以對指標進行加減運算,但與一般的加減運算不同,對指標的加減 n 會加減指標所指向的型別所占用的位元組數的 n 倍。這種運算的作用在於對陣列進行遍歷等操作,離開陣列對指標進行這樣的操作是沒有太大意義的。
指標與指標之間的運算也是同樣的道理。
int array[20]
=;int*ptr = array;
for(
int i =
0; i <
20; i++
)for
(int i =
0; i <
20; i++
)int
* ptr1 =
&array[0]
;int
* ptr2 =
&array[4]
;cout << ptr2 - ptr1;
// 4
if(ptr1 != ptr2)
char
*strings[2]
=;
首先,從定義中的[2]
可看出這是乙個陣列,這個陣列的每個元素是什麼型別的呢?char *
告訴了我們。所以這是乙個大小為兩個元素的陣列,每個元素都是char *
型別的,兩個元素分別初始化為"hello"和"world"。
那麼strings[0]
就是"hello",strings[1]
就是"world"。
strings[0][0]
就是"hello"的第乙個字元『h』,以此類推。
函式指標指向了函式的首位址。
int (*compare)(int a, int b)
細節待續。
C語言 指標變數的基本使用
我們將乙個指標變數定義好之後,接下來需要考慮的問題就是如何來使用這個指標變數了。前面學習普通變數的時候,我們知道,乙個變數的操作其實就是分成讀和寫兩個步驟。而指標變數在平時使用的時候,也是主要分成讀和寫兩個操作步驟,不同於常規變數的是,指標變數的賦值運算其實是寫入乙個普通變數的位址,我們將這乙個過程...
c語言 指標的基本操作
include intmain int ptr1,ptr2,ptr3 ptr1 urn 把乙個位址賦給指標 ptr2 urn 2 printf pointer value,dereferenced pointer,pointer address n printf ptr1 p,ptr1 d,ptr1...
C語言指標的使用
1.陣列與指標 把陣列的首位址指向陣列的指標變數 int a 5 pa pa a 陣列名表示陣列的首位址也可以寫成 pa a 0 兩者是等價的 pa pa 2 pa指向a 2 空指標是由對指標變數賦予0值而得到的。對指標變數賦0值和不賦值是不同的。指標變數未賦值時,可以是任意值,但不能使用,否則會造...