概述:主要講述指標的遞增、遞減、加法(指標加上整數)、減法(指標減去整數)和指標相減
下面描述指標變數的基本操作,通過程式來說明
/*定義乙個陣列和5個指標*/
int urn[5] = ;
int *ptr1, *ptr2, *ptr3, *ptr4;
可以把位址賦給指標。例如用陣列名、帶位址運算子&的變數名、另乙個指標進行賦值。
ptr1 = urn; //把乙個位址賦給指標,陣列名是陣列的首元素首位址
ptr2 = &urn[2]; //把陣列的第三個元素的位址賦給指標
* 運算子給出指標指向位址上儲存的值。如下面**值中,列印出來的*ptr1 = 100.
//解引用儲存在指標位址上的值
和所有變數一樣,指標變數也有自己的位址。如&ptr1指向ptr1的指標
//列印指標自己的位址和指標的值(該指標指向的位址)可以使用+運算子把指標與整數相加,或者把整數與指標相加。無論是哪種情況,整數都會與指標所指向的資料型別的位元組數相乘,然後把結果與初始位址相加,比如定義乙個指標int *ptr1; 那麼ptr1+4 與&urn4相當於ptr1所指向的那個變數的位址(初始位址)+4×sizeof(int)printf("指標ptr1自己的位址 = %p\n", &ptr1);
printf("ptr1 = %p\n", ptr1);
printf("ptr2 = %p\n", ptr2);
//指標加法
ptr3 = ptr1 + 4; //ptr1的值加上4×sizeof(int)
printf("指標加法:ptr3 = %p\n", ptr3); //ptr3指向urn[4]
遞增指向陣列元素的指標,可以讓指標指向陣列的下乙個元素。因此ptr1++相當於把ptr1的值加上1×sizeof(int),也就是4(因為int為4個位元組),ptr1指向urn[1]
//遞增指標
ptr1++; //ptr1++後指標變數ptr1指向urn[1]
printf("遞增指標:ptr1++ = %p\n", ptr1++);
可以使用「-」運算子從乙個指標減去乙個整數。
//指標減去乙個整數
ptr4 = ptr2 - 1; //相當於指標向前移動了乙個int(4個位元組)
printf("指標減法:ptr4 = %p\n", ptr4); //ptr4指向urn[3]
//printf("&urn[3] = %p\n", &urn[3]);
7.遞減指標
//遞減指標
ptr2--; //ptr2--後指標變數ptr2指向urn[1]
printf("遞減指標:ptr2-- = %p\n", ptr2--);
8.指標求差
可以計算兩個指標的差值(注意:計算兩個指標的和值是沒有意義的,但是計算差值還是有一定意義的)。通常兩個指標分別指向同一陣列的不同元素,通過指標求差,可以計算出兩個陣列之間的距離。注意:差值的單位與陣列型別的單位相同。
//指標求差
int num = 0;
num = ptr3 - ptr4; //兩個指標變數值相減,得到num個sizeof(int)
printf("指標求差:ptr3 - ptr4 = %d\n", num); //意思是這兩個指標【所指向的元素】相隔乙個int
執行結果及分析:
完整**:
#include int main()
; int *ptr1, *ptr2, *ptr3, *ptr4;
ptr1 = urn; //把乙個位址賦給指標,陣列名是陣列的首元素首位址
//解引用儲存在指標位址上的值
//列印指標自己的位址和指標的值(該指標指向的位址)
printf("指標ptr1自己的位址 = %p\n", &ptr1);
printf("ptr1 = %p\n", ptr1);
ptr2 = &urn[2]; //指標賦值,給指標繫結乙個位址.這裡把陣列的第三個元素的位址賦給指標
printf("ptr2 = %p\n", ptr2);
//指標加法
ptr3 = ptr1 + 4; //ptr1的值加上4×sizeof(int) //ptr3指向urn[4]
printf("指標加法:ptr3 = %p\n", ptr3);
//遞增指標
ptr1++; //ptr1++後指標變數ptr1指向urn[1]
printf("遞增指標:ptr1++ = %p\n", ptr1++);
//指標減去乙個整數
ptr4 = ptr2 + 1; //ptr4指向urn[3]
printf("指標減法:ptr4 = %p\n", ptr4); //相當於指標向前移動了乙個int(4個位元組)
//printf("&urn[3] = %p\n", &urn[3]);
//遞減指標
ptr2--; //ptr2--後指標變數ptr2指向urn[1]
printf("遞減指標:ptr2-- = %p\n", ptr2--); //--後指標變數ptr1指向urn[1]
//指標求差
int num = 0;
num = ptr3 - ptr4;
printf("指標求差:ptr3 - ptr4 = %d\n", num); //意思是這兩個指標【所指向的元素】相隔乙個int
return 0;
}
【注意】
1. 在指標遞增或者遞減時需要注意指標越界問題。因為編譯器不會檢查指標是否仍會指向陣列元素。c語言只能保證指向陣列任意元素的指標和正向陣列後面第乙個位置的指標有效。但是,如果遞增或者遞減乙個指標超出了這個範圍,則是未定義的。
2. 注意解引用時可能會解引用到陣列後面乙個位置的指標(越界指標)。我們可以解引用指向陣列任意元素的指標,但是,即使指標指向陣列後面乙個位置是有效的,也能解引用這樣的指標。但一般越界指標是沒意義的。
C語言基礎知識 指標
指標定義 資料型別 變數名 指標的定義 include int main include int main include int main printf a d,b d n a,b a 3,b 5 printf max d,min d n p1,p2 max 5,min 3 return 0 交換...
C語言中指標基礎知識
首先明白 位址 概念,位址就是儲存單元的編號,而指標呢就是用來儲存位址的變數。定義乙個指標變數時候要用 帶 的變數就是指標變數例如 定義乙個int型別的變數 int a 定義乙個int型別的指標 int p 其次要明確兩個符號 和 符號,總共會在兩個地方用到,乙個是在定義指標的時候,另乙個是在獲取位...
c和指標 指標基礎知識
1 記憶體和位址 2 指標初始化 3 指標變數的內容 4 間接訪問操作符 5 非法指標 null指標 1 記憶體和位址 指標是儲存的位址,比如0x0,0x1 0x2 可以這麼理解 指標可以狹義理解為記憶體位址,是存放記憶體位址的變數。網上或者書上,總是一段很多字數去表示指標說什麼,剛開始學習時候,看...