C語言筆記【3】
不知道在哪看到的一道題目,本來覺得很簡單,指針學的一般的我竟然選擇不出來答案!!!
#include <stdio.h>
int main()
{
int b=3;
int arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)+=123;
printf("%d,%d\n",*ptr,*(++ptr));
for(int i=0;i<5;i++)
printf("%d ",arr[i]);
return 0;
}
運作結果:
答案:8 8
【正确解釋】
*(ptr++)+=123;
++符号放在後面先用後加,是以arr[0]=123+6=129,然後ptr指向arr[1]所在的位址。
printf("%d,%d\n",*ptr,*(++ptr));
難懂的是這兩個指針變量的調用順序.
有兩種解釋:
1、printf的參數,函數printf從左往右讀取,然後将先讀取放到棧底,最後讀取的放在棧頂,處理時候是從棧頂開始的,所有從右邊開始處理的。
2、這句代碼的執行涉及到彙編的函數的參數的壓棧過程是從後面的參數開始壓棧的,是以*(++ptr)會先被壓棧,導緻++ptr首先生效是以往棧裡壓入*ptr時,此時的ptr已經變成指向arr[2]了。
這兩種我感覺都可以了解。
類似于:
#include <stdio.h>
int main()
{
int i = 1;
printf("%d,%d\n", i,++i);
return 0;
}
【拓展】:
1、*在C語言中代表三種含義:
* | 标志 (比如:int *p) |
---|---|
* | 指針運算 (比如 * p++) |
* | 乘法運算(比如 3*5) |
2、*p++與(*p)++
(*p)++指的是先取出p指向的存儲單元中的内容,然後将取出的數值加1,而p仍然指向原來的存儲單元。
*p++則指的是先取出p指向的存儲單元中的内容,然後将p值加1,此時p不再指向原來的存儲單元。
【參考】
1、https://blog.csdn.net/daima66699/article/details/53638430
2、https://blog.csdn.net/hemingliang1987/article/details/9132455