1. 程式人生 > >C語言的指標移動怎麼理解

C語言的指標移動怎麼理解

 C Primer pkus(第五版)中文版,老外寫的還是很經典的,推薦給朋友們,購買地址:C primer plus 5版中文版購買

另外再推薦本書:


剛學習C語言的朋友,對指標“移動”可能不太理解。舉個例子,例如下述程式碼:

int a = 1;

那麼大家都知道a + 1肯定就是2了。如果是指標呢?例如:

int *p = 1;

p + 1還是2嗎?

為了說明問題,請看以下程式碼:

#include "stdio.h"
#include "stdlib.h"

int main()
{
	int index = 0;
	int number[3] = {1, 2, 3}; //定義一個整型陣列
	int *p = &number[0]; //指標p的初始值是陣列第一個元素的地址
	printf("p的值是 %x\n", p); //輸出p的值,也就是陣列第一個元素的地址

	printf("本機int型別佔用 %d 個位元組\n", sizeof(int)); //得知本機上int型別佔用多少位元組

	for(index = 0; index < 3; index++)
	{
		printf("第 %d 個元素的地址是 %x\n", index + 1, &number[index]);
	}//輸出陣列中每一個元素的地址

	for(index = 0; index < 3; index++)
	{
		printf("p加 %d 的值是 %x\n", index, p + index);
	}//輸出指標p+1, p+2, p+3的值
	
	return 0;
}  


程式很簡單,目的就是為了說明指標p自己加上1、2、3分別得到什麼值。執行結果如下:


指標p的初始值就是陣列第一個元素的地址,為“12ff70”。那麼從p + 1開始,並不是簡單的12ff70 + 1 = 12ff71,而是12ff70 + 4 = 12ff74。p + 2也不是12ff70 + 2 = 12ff72,而是12ff70 + 4 + 4 =12ff78。所以指標的增加運算與本文開頭的整型變數a的增加運算還不一樣,這也是許多初學者經常會糊塗的一個地方。

指標p +n其實計算的是p加上n*型別佔用位元組數。本文指標p是int型別,本機中,使用sizeof計算出的int佔用的位元組數是4。因此,p + 1其實就是p + 1 * 4個位元組,p + 2其實就是p + 2 * 4個位元組。關於每種型別在本機上佔用的位元組數網上有很多介紹,讀者可以自行搜尋下。

可能也有的朋友說,這個我懂啊,p + 1其實就是往前移動了4個位元組啊!但是太自大也不好,太自大的結果就是你心裡知道p + 1是跨越了4個位元組的地址,但是手一抖,寫成了p + 4,你說這是筆誤呢還是筆誤呢?