指標的遞增遞減

若能善用指標的話,我想程式設計起來一定簡潔又明白,但是對於初學者而言,指標又偏偏的那個不好學,而且又常看別人程式出現了*ptr++等奇怪的東西,所以就來徹底的分析一下指標的遞增遞減,在看這篇前,請先對「指標的觀念」有明確的認知。

指標的遞增遞減(++, - -)其實也沒有什麼好怕的,就只是讓指標內容值,增加一單位的型別大小,如int* ptr;那ptr++的話會增加4bytes而同樣的,但是透過指標和陣列的組合,因為陣列資料是連續的,而就那麼剛剛好把指標遞增的話,剛剛好可以移動到下一個元素,所以指標才會那麼多人愛用,因為只要簡單的(++)就行了,但是問題來了,當你(++)過了頭,出了陣列的邊界的話,雖然不會怎麼樣,但是只要你有解參考(dereference)的話,嘿嘿你就等著「程式區段錯誤」吧!

※ 指標遞增與解參考

* *ptr++

1. *ptr 先解參考(dereference)
2. ptr+=1 指標指向下一個元素

Example:

int a[3] = {1, 2, 3};
int* ptr = a;
printf("%d\n", *ptr++); (output 1)
printf("%d\n", *ptr); (output 2)

* *++ptr

1. ptr+=1 指標指向下一個元素
2. *ptr 後解參考(dereference)

Example:

int a[3] = {1, 2, 3};
int* ptr = a;
printf("%d\n", *++ptr); (output 2)
printf("%d\n", *ptr); (output 2)

* (*ptr)++

1. *ptr 先解參考(dereference)
2. data+=1 遞增運算對指向的變數遞增,就是把ptr所指向的那個變數加1

Example:

int a[3] = {1, 2, 3};
int* ptr = a + 2;
(*ptr)++;
printf("%d\n", *ptr); (output 4)

* ++(*ptr)

和(*ptr)++效果一樣,但是最大的不同就是寫在輸出值的時候

Example:

printf("%d\n", (*ptr)++); (輸出未遞增的變數內容,後效用)
printf("%d\n", ++(*ptr)); (輸出已遞增的變數內容,立刻效用)

※ 範例參考

Example:

int data[2] = {100, 200};
int moredata[2] = {300, 400};
int* ptr1;
int* ptr2;
int* ptr3;ptr1 = ptr2 = data;
ptr3 = moredata;
printf("*ptr1=%d, *ptr2=%d, *ptr3=%d", *ptr1, *ptr2, *ptr3);
printf("*ptr1++=%d, *++ptr2=%d, (*ptr3)++=%d", *ptr1++, *++ptr2, (*ptr3)++);
printf("*ptr1=%d, *ptr2 = %d, *ptr3=%d", *ptr1, *ptr2, *ptr3);結果是:*ptr1=100, *ptr2=100, *ptr3=300
*ptr1++=100, *++ptr2=200, (*ptr3)++=300
*ptr1=200, *ptr2=200, *ptr3=301

0 意見: