首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言指標運算詳解:p++、(*p)++、陣列指標與位址運算實例

     編輯:關於C語言

C 語言指標運算詳解:p++、(*p)++、陣列指標與位址運算實例

指標運算是 C 語言核心也最易混淆的部分。本文以 int *p 為例,透過程式碼與執行結果圖解,釐清 *p++、(*p)++、指標加減與位址輸出的關鍵差異。

1. *p++ / *(p+n):指標遞增,非所指值遞增

* 與 ++ 優先序相同,結合方向自右向左,故 *p++ 等價 *(p++):

  1. 先取當前 p 所指值(*p)。
  2. 再將 p 移向下一個元素(p+1)。
int cww[] = {1, 10, 100};
int *a = cww;
printf("*a=%d\n*(a+1)=%d\n*(a+2)=%d\n", *a, *(a+1), *(a+2));

輸出: 1, 10, 100

執行結果圖

2. (*p)++ / (*p)+n:所指值遞增

括號改變優先序:先取值再遞增該記憶體位置的內容,指標本身不變。

int val = 5;
int *p = &val;
(*p)++;  // val 變為 6,p 位址不變

3. 位址運算實測

int cww[] = {1, 10, 100};
int *a = cww;
printf("a =%d\na+1 =%d\na+2 =%d\n&(*a)=%d\n", a, a+1, a+2, &(*a));
printf("a =%p (十六進位)\n", (void*)&a);

關鍵觀察:

  • a+1 位址 = a 位址 + sizeof(int)(通常 4 位元組)。
  • &(*a) 等同 a(解參考再取址回到原位址)。
  • %p 印十六進位位址,%d 印十進位(可能截斷 64 位址)。

位址輸出結果

4. 總結表

運算式效果指標是否改變所指值是否改變
*p++取值後指標移下一元素是否
*p--取值後指標移上一元素是否
(*p)++所指值加 1否是
*(p+1)取下一元素值否否
&(*p)取所指變數位址(=p)否否

5. 避坑指南

  • 習慣加括號:*(p+1)、(*p)++,明確語意。
  • 指標減法:p2 - p1 回傳元素個數差,非位元組差。
  • void* 不能直接做指標運算,需轉型為具體型別指標。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved