C 指針是一個用數值表示的地址。因此,您可以對指針執行算術運算。可以對指針進行四種算術運算:++、--、+、-。
假設**ptr**是一個指向地址 1000 的整型指針,是一個 32 位的整數,讓我們對該指針執行下列的算術運算:
~~~
ptr++
~~~
在執行完上述的運算之后,**ptr**將指向位置 1004,因為 ptr 每增加一次,它都將指向下一個整數位置,即當前位置往后移 4 字節。這個運算會在不影響內存位置中實際值的情況下,移動指針到下一個內存位置。如果**ptr**指向一個地址為 1000 的字符,上面的運算會導致指針指向位置 1001,因為下一個字符位置是在 1001。
我們概括一下:
* 指針的每一次遞增,它其實會指向下一個元素的存儲單元。
* 指針的每一次遞減,它都會指向前一個元素的存儲單元。
* 指針在遞增和遞減時跳躍的字節數取決于指針所指向變量數據類型長度,比如 int 就是 4 個字節。
## 遞增一個指針
我們喜歡在程序中使用指針代替數組,因為變量指針可以遞增,而數組不能遞增,數組可以看成一個指針常量。下面的程序遞增變量指針,以便順序訪問數組中的每一個元素:
如下實例
```
#include <stdio.h>
const int MAX = 3;
int main ()
{
int var[] = {10, 100, 200};
int i, *ptr;
/* 指針中的數組地址 */
ptr = var;
for ( i = 0; i < MAX; i++)
{
printf("存儲地址:var[%d] = %p\n", i, ptr );
printf("存儲值:var[%d] = %d\n", i, *ptr );
/* 指向下一個位置 */
ptr++;
}
return 0;
}
```
當上面的代碼被編譯和執行時,它會產生下列結果:
~~~
存儲地址:var[0] = e4a298cc
存儲值:var[0] = 10
存儲地址:var[1] = e4a298d0
存儲值:var[1] = 100
存儲地址:var[2] = e4a298d4
存儲值:var[2] = 200
~~~
## 遞減一個指針
同樣地,對指針進行遞減運算,即把值減去其數據類型的字節數,如下所示:
```
#include <stdio.h>
const int MAX = 3;
int main ()
{
int var[] = {10, 100, 200};
int i, *ptr;
/* 指針中最后一個元素的地址 */
ptr = &var[MAX-1];
for ( i = MAX; i > 0; i--)
{
printf("存儲地址:var[%d] = %p\n", i-1, ptr );
printf("存儲值:var[%d] = %d\n", i-1, *ptr );
/* 指向下一個位置 */
ptr--;
}
return 0;
}
```
當上面的代碼被編譯和執行時,它會產生下列結果:
~~~
存儲地址:var[2] = 518a0ae4
存儲值:var[2] = 200
存儲地址:var[1] = 518a0ae0
存儲值:var[1] = 100
存儲地址:var[0] = 518a0adc
存儲值:var[0] = 10
~~~
## 指針的比較
指針可以用關系運算符進行比較,如 ==、。如果 p1 和 p2 指向兩個相關的變量,比如同一個數組中的不同元素,則可對 p1 和 p2 進行大小比較。
下面的程序修改了上面的實例,只要變量指針所指向的地址小于或等于數組的最后一個元素的地址 &var\[MAX - 1\],則把變量指針進行遞增:
```
#include <stdio.h>
const int MAX = 3;
int main ()
{
int var[] = {10, 100, 200};
int i, *ptr;
/* 指針中第一個元素的地址 */
ptr = var;
i = 0;
while ( ptr <= &var[MAX - 1] )
{
printf("存儲地址:var[%d] = %p\n", i, ptr );
printf("存儲值:var[%d] = %d\n", i, *ptr );
/* 指向上一個位置 */
ptr++;
i++;
}
return 0;
}
```
當上面的代碼被編譯和執行時,它會產生下列結果:
~~~
存儲地址:var[0] = 0x7ffeee2368cc
存儲值:var[0] = 10
存儲地址:var[1] = 0x7ffeee2368d0
存儲值:var[1] = 100
存儲地址:var[2] = 0x7ffeee2368d4
存儲值:var[2] = 200
~~~
- 空白目錄
- 第一章 c語言簡介
- 1 通俗地理解什么是編程語言
- 2 C語言究竟是一門怎樣的語言
- 第二章 算法簡介&基本語法
- 1 算法簡介
- 2 C 程序結構
- 3 C 基本語法
- 第三章 數據類型
- 1 數據類型
- 2 變量
- 3 常量
- 第四章 運算符
- 1 算術運算符
- 2 關系運算符
- 3 邏輯運算符
- 4 位運算符
- 5 賦值運算符
- 6 雜項運算符(其他運算符)
- 7 c語言中的運算符優先級
- 第五章 控制流
- 1 判斷語句
- 2 switch語句
- 3 循環語句
- 4 流程控制相關案例
- 第六章 指針
- 1 c語言指針概述
- 2 指針的算術運算
- 3 指針數組
- 4 指向指針的指針
- 5 傳遞指針給函數
- 6 從函數返回指針
- 第七章 函數
- 1 函數的語法
- 2 作用域規則
- 3 形參與實參
- 第八章 數組
- 1 C語言中的數組
- 2 多維數組
- 3 傳遞數組給函數
- 4 從函數返回數組
- 第九章 指針
- 1 分鐘徹底理解C語言指針的概念
- 2 C語言指針變量的定義和使用
- 3 C語言指針變量的運算(加法、減法和比較運算)
- 4 C語言數組指針(指向數組的指針)
- 5 C語言字符串指針(指向字符串的指針)
- 第十章 結構體
- 第十一章 練習
- 第十二章 文件操作
- 第十三章 文件操作2