指針運算拾遺I

指針運算拾遺I

如有錯誤,歡迎指正。
如若轉載,請聲明原創:https://blog.csdn.net/qq_29567701/article/details/82721745

包含如下例子:
1、*p + *p++ + *++p;
2、++*p++;
3、char(*p)[2]; *(*(p + 1)); *(*p + 1);

2018.10.30 添加:更正了之前 關於指針運算的 一些表述不當的說法。
如:後置++運算符,之前錯誤說法:“在該行表達式結束後起作用,指針向後挪一位”
正確說法“在該表達式計算結束後起作用,指針向後挪一位”
因爲可能自加1之後,在同一行就進行了輸出。

eg:
	int a[] = { 10, 20, 30, 40, 50, 60, 70, 80 };
	int n = sizeof(a) / sizeof(a[0]);
	int*p = a + 4;
	cout << *p << endl;
	cout << 4 + ++*p++ << "\t" << *p << endl;// 55  60
	disp(a, n);
/*
輸出結果如下:
50
55      60
10      20      30      40      51      60      70      80
*/
分析:
1、 4 + ++*p++;相當於 4 + (++*p++)
2、++*p++ 相當於 ++ ( *(p++) )
2.1、++ ( *(p++) )
int*p = a + 4;//p剛開始指向了a[4], 50
p++ // 在該表達式 4 + ++*p++ 計算結束後起作用,指針向後挪一位;當前p仍然指向a[4], 50
*(p++) //取 a[4]的值,50
++ ( *(p++) ) //對50進行自加1操作 ++50=51
++();相當於 ++(*px) 相當於 *px = (*px) +1;

故:最終 的 4 + ++*p++ = 4 + 51 = 55;

同一行中,再次調用了之間後置++過的指針p;
進行了取值運算操作 *p
此時,上一個表達式中的後置++,起作用了,p指向了數組a中的下一個位置的元素a[5],
故,*p,即是取a[5]中的元素值,60

一、*p + *p++ + *++p;
題目:

	int a[] = { 1, 2, 3, 4, 5 };
	int *p = a;
	int result = *p + *p++ + *++p;
	cout << result << endl;

結果:6
分析如下:
1、 C++運算符優先級:
優先級 Top2: -(負號運算符)、++(後置++、前置++)、--(後置--、前置--)、*(指針取值運算符)、&(取地址運算符) 一個級別,遇到後,從左向右運算
注意其中,++--,比 * 優先級高
優先級 Top3: /*(乘)、%
優先級 Top4: +-(減法運算符)
優先級 Top8: &(按位與)、|^
2、*p + *p++ + *++p;

(1) 先做優先級高的運算:  ++
++運算符中,後置++比前置++優先級更高,故,先計算後置++
int *p = a;//p指向a[0]
p++; 等到表達式*p + *p++ + *++p;全部計算完畢之後,p指向下一個位置a[1],當下,p還是指向a[0].
 再運算前置++
 ++p; 指針p指向a數組的下一個元素,a[1],
 此時,表達式相當於:優先級如下:1,2,3...優先級遞減
	(*p) + (*(p++)) + (*(++p));
	          1.1        1.2  
	 2       2         2
	     3           3
	注意此時,*p + *p++ + *++p; 表達式中所有的 指針p 都指向了a[1]
(2) 再做Top2中的次優先級:*(指針取值運算符)
取指針p當前所指數組元素a[1]中的值,2
	*p =2
	*p++ =2
	*++p =2
故最終的結果爲2+2+2=6;

二、++*p++;
題目:

	int a[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
	int *p = a + 4;
	int b = 4 + ++*p++;
	cout << b << endl;

結果:10
分析如下:

1、int *p = a + 4;
指針p指向了 a[4], 即5
2、4 + ++*p++; 相當於 4 + ( ++*p++ );
	分析 ++*p++;:
	++*p++; 相當於 ++(*(p++));
	
	前置++和後置++是同一個優先級,故從左向右運算
	*(取值算符)雖然也是 Top2的優先級,但是卻比++運算符優先級低
(1)故先運算p++
p++爲後置運算符,故在該表達式4 + ++*p++運算結束之前,p是一直指向a[5]的,在該表達式運算結束後,p會指向a數組當前位置的下一位a[6].
(2)再運算 *(p++)
取p指針當前指向數組a中的值, 即a[5]的值,5
(3)最後運算 ++(*(p++));
對取來的值進行 自加1操作, ++5 = 6;
相當於 ++*px; 即 ++(*px), 即 *px=(*px)+1;

	故此時 ++*p++; 結果爲 6
	故 4 + ++*p++; 結果爲 4+6=10;

三、char(*p)[2]; *(*(p + 1)); *(*p + 1);

	char a[2][2] = { { 'a', 'b' }, { 'c', 'd' } };
	char(*p)[2] = a;//p:指向有兩個char型字符數組的指針

//僅僅輸出下面這一行
//	cout << *p << endl;//abcd燙燙構we<?

//僅僅輸出下面這一行
//	cout << *p + 1 << endl;//bcd燙燙諏?鳥

//僅僅輸出下面這一行
//	cout << *(p + 1) << endl;//cd燙燙凜€棼=

//僅僅輸出下面這一行
//	cout << *(*(p + 1)) << endl;//c

//僅僅輸出下面這一行
//	cout << *(*p + 1) << endl;//b
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章