C語言筆記----指針變量

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章