C語言精要總結 指標系列(二)

2021-09-20 04:29:04 字數 3566 閱讀 7198

此文為指標系列第二篇:

c語言精要總結-指標系列(一)

c語言精要總結-指標系列(二)

前面提到過指標的解引用運算,除此之外,指標還能進行部分算數運算、關係運算

指標能進行的有意義的算術運算包括加減法運算,但不包括乘除運算。並且運算存在諸多限制。

加法運算

指標加法運算只適合指標與整數,不能用在指標與指標。

指標加上或者減去乙個整數n,是儲存的位址值加上或者減去n*指標指向型別的空間大小。也就是

結果指標 = 指標 ±  n * 指標指向型別空間大小。

例如int型別的整數指標+1,運算結果依然是乙個整型指標,其儲存的位址值為原指標值+1*4,這是因為整型變數占用4個位元組的空間。這個計算結果,恰好在當前指標指向基礎上,向下偏移指向下乙個相同型別的空間。如下圖

指標與整數的加減法一般用在迭代連續的記憶體空間-陣列,如果運算得到的指標指向第乙個元素之前或者最後乙個元素之後,可能會產生非法讀寫記憶體中斷,就像引用乙個未初始化的指標一樣不可預知。

指標除了可以與整數做加減運算,連個指標之間還可以做減法運算(不能做加法運算)且必須是同型別的指標。運算結果為兩個指標指向位址之間,可以存放多少此型別的變數數(或其相反數),型別為ptrdiif_t型別(一種有符號整數型別)。

1

int * p1 = (int *) 0x100;2

int * p2 = (int *) 0x10c

;3 printf("

p2-p1 : %d\n

",p1 - p2); // -3

如上程式將輸出-3,也如上圖所示,這3個空間存放著 10、80、6三個整型變數。

指標與指標相減,一般也用在連續位址空間-陣列中。此時兩個指標相減跟下標索引相減是等價的。

1

int arr[5

] ;2 printf("

%d\n

",&arr[4] - &arr[0] == 4 - 0); //

1

常量指標表示通過此指標,不能修改其指向的記憶體區域的內容,指標本身的值是可以修改為指向另乙個變數,雖然可以修改指向另乙個變數,但是依然不允許修改指向變數裡的內容。常量指標一般用在函式一些函式引數中,以唯讀的方式傳遞函式引數。這裡說明一點c語言除了巨集定義常量和列舉之外,是不能定義普通常量的,只可用const定義唯讀變數,而常量指標指向的是就是乙個唯讀變數。唯讀變數是不能修改的變數。

1

const

int readonlyvar = 10;2

int * provar = (int *) &readonlyvar;

3 * provar = 11

;4 printf("

%d\n

",readonlyvar);

而指標常量表示指標本身的內容不可變(指向不可變),因此,定義指標常量時必須同時初始化乙個位址值。

定義指標常量和定義常量指標的方式區別在於const關鍵字的位置

int

const *p1 ;

const

int *p2 ;

int * const p3 =null;

const

int * const p4 = null;

以*號為界限,看cosnt修飾的是誰,如果修飾的是型別關鍵字,表示指向常量型別——常量指標,如果修飾的是指標識別符號,表示指標常量。顯然p1、p2是常量指標,p3是指標常量,p4既是常量指標,又是指標常量。

指標陣列指元素由指標組成的陣列,一般用在儲存字串組,例如下面的程式

1

char * options[5] =;

6for (i = 0 ; i < 5 ;i ++)

711 }

此時指標陣列前三個成員指向靜態區的三個字串常量,而後兩個指標被預設初始化為0(null)

c語言**現的字串字面量,實際是儲存在靜態資料區的字串常量。當乙個字串出現在c語言表示式中,其實際值是乙個指標常量。如下面宣告乙個指標常量的**

char * str = "

hello

";

可以用另一段**來描述,即先在某處為字串分配空間,記錄指向第乙個字元的乙個指標常量,並將字元拷貝進去。**如下

char * const strbuff = (char * ) malloc (6

);strcpy(strbuff,

"hello");

char * str =strbuff;

free(strbuff);

既然明確字串常量在**中實際是乙個指標常量,因此其也可以參與運算。**如下

printf("

%c\n

",* "

hello

"); //

hprintf("

%s\n

", "

hello

" + 1);//

ello

常量指標「hello」+1後得到乙個新的指標,按指標運算的規則將指向下乙個e,所以以字串形式輸出ello

除此之外指標輸在還用在處理許多多維陣列的地方,這在後續的章節中會提到。

常量指標陣列表示元素都指向常量的陣列。定義方式如下

1

const

char * options[5] =;

當然,這裡的例子,const加與不加沒太大區別,因為即便不加const關鍵字,options中的每乙個元素依然是指向乙個字串常量,是不能修改的。例如要將「--list」中的第2個『-』換成'+'號,下面的**是行不通的,方法只有讓指標指向乙個全新的字串常量(因為是常量指標,所以指標本身的內容可以修改)

* (options[0] + 1) = '

+';

加上const的好處是,讓編譯器或者ide工具在執行之前便告知你此類**存在的問題。關於字串常量,下面的異常**可能更易懂一些

char * str = "

hello";

*(str + 3) = '

w';

指標常量陣列表示每個指標元素都是不可修改的(指向固定了),但是其指向內容,視情況是可以修改的。

1

char * const options[5] =;

當然,因為字串常量的緣故,上面的**定義了乙個指標元素、指標元素指向區域內都不可變的指標陣列。例如,像下面的**都是非法的

1 options[0] = tmpstr; //

修改指標指向新的字串常量

2 *(options[0]) = '

+'; //

修改第乙個元素指向區域的內容

下一系列將用一兩個複雜的案例詳細講解指標與陣列的關係。

C語言指標系列

從語法的角度看,你只要把指標宣告語句裡的指標名字去掉,剩下的部 分就是這個指標的型別。這是指標本身所具有的型別。讓我們看看例一中各 個指標的型別 1 int ptr 指標的型別是 int 2 char ptr 指標的型別是 char 3 int ptr 指標的型別是 int 4 int ptr 3 ...

C語言系列筆記 指標

指標變數的本質是用來放位址的,而一般的變數是放數值的。例題 int p a p a 請問p 和 p 的數值分別為多少?p 這個本身的數值為1,由於是位址會增加1,所以指標指向數值3了。p 這個本身的數值為1.由於有個 表示數值會增加,指標不移動,但數值1由於自加了一次變成2。例題 int x 7 i...

C語言指標總結

2012 03 07 07 22 標籤 c語言 分類 pointer c語言中的精華是指標,這也是c語言中唯一的難點。c是對底層操作非常方便的語言,而底層操作中用到最多的就是指標,以後從事嵌入式開發的朋友們,指標將陪伴我們終身。1.指標型別分析 分析指標,可以從變數名處起,根據運算子優先順序結合,一...