1. 指針基礎練習:演示p++
、++p
和(*p)++
的區別
核心目的:區分指針自增與指針指向值自增的不同邏輯,理解運算符優先級對指針操作的影響。
#include <stdio.h>void arr1()
{int arr[] = {11,13,15,17,19};int *p = arr;printf("結果1:%d\n",*p); //結果為11
}void arr2()
{int arr[] = {11,13,15,17,19};int *p = arr;int x = *p++;printf("結果2:%d,%d\n",x,*p); //11,13
}void arr3()
{int arr[] = {11,13,15,17,19};int *p = arr;int y = *(++p);printf("結果3:%d,%d\n",y,*p); //13,13
}void arr4()
{int arr[] = {11,13,15,17,19};int *p = arr;int z = (*p)++;printf("結果4:%d,%d\n",z,*p); //11,12
}int main()
{arr1();arr2();arr3();arr4();return 0;
}
結果:
原理:
*p++
:優先級上++
高于*
,但++
后置時先執行*p
(取當前值),再讓p
指向后一個元素。*++p
:++
前置時先讓p
指向后一個元素,再執行*p
(取新指向的值)。(*p)++
:通過括號提升*
的優先級,先取p
指向的值,再對該值進行自增(指針p
的指向不變)。
2. 數值交換函數:通過指針修改原變量值
核心目的:演示如何通過指針傳遞變量地址,在函數內部修改外部變量的值(解決函數參數 “值傳遞” 無法修改原變量的問題)。
#include <stdio.h>//數值交換
void swap(int *p_a,int*p_b)
{int time;//交換time= *p_a;*p_a = *p_b;*p_b = time;printf("交換后:%d,%d\n",*p_a,*p_b); //
}int main()
{int a = 3,b = 4;printf("交換前:%d,%d\n",a,b); //3,4swap(&a,&b);return 0;
}
結果:
原理:
- 函數參數
int *a
和int *b
接收變量的地址,*a
和*b
表示 “地址指向的變量”。 - 通過指針直接操作原變量的內存空間,實現了外部變量的值交換(若用普通變量參數,只能交換函數內部的副本,不影響外部變量)。
3. 指針交換函數:僅交換局部指針變量
核心目的:演示 “指針變量本身也是值”,若僅傳遞指針變量的副本,函數內部交換指針不會影響外部指針的指向。
#include <stdio.h>//指針指向
void swap(int *p_a,int*p_b)
{int *p_t;//交換p_t= p_a;p_a = p_b;p_b = p_t;printf("交換后:%d,%d\n",*p_a,*p_b); //
}int main()
{int a = 3,b = 4;printf("交換前:%d,%d\n",a,b); //3,4swap(&a,&b);return 0;
}
結果:
原理:
- 函數
swap_ptr
接收的是指針p
和q
的副本(值傳遞),內部交換的是副本的指向,外部原指針p
和q
的指向不受影響。 - 若要通過函數交換外部指針的指向,需使用 “二級指針”(指針的指針),如
void swap_ptr(int **a, int **b)
。
4. 數組翻轉函數:通過指針操作實現數組逆序
核心目的:演示如何通過指針遍歷數組,并通過地址計算實現數組元素的逆序(無需額外數組,原地翻轉)。
#include <stdio.h>void inv1(int arr[],int len)
{register int i = 0,temp;for(;i < len/2 ; i++){temp = arr[i];arr[i] = arr[len - i - 1];arr[len - i - 1] = temp;}
}void list(const int *arr,int len)
{const int *p = arr;for(;p < arr + len;p++)printf("%-4d",*p);printf("\n");
}int main(int argc,char *argv[])
{int arr[] = {1,3,5,6,9,2,7,33};int len = sizeof(arr) / sizeof(arr[0]);list(arr,len);inv1(arr,len);list(arr,len);return 0;
}
結果:
原理:
- 定義
left
(首元素指針)和right
(尾元素指針),通過left < right
控制循環(只需交換一半元素)。 - 每次交換
left
和right
指向的元素,然后分別移動指針向中間靠攏,最終實現數組逆序。 - 指針操作避免了數組下標計算,更直接地操作內存地址,效率與下標訪問一致(編譯器通常會將下標優化為指針)。
總結
這四個實例從基礎到應用,覆蓋了指針的核心操作:
- 指針運算(自增、優先級)影響指向與值的邏輯;
- 指針作為函數參數時,可實現對外部變量的修改(值傳遞 vs 地址傳遞);
- 指針與數組結合時,可通過地址計算高效操作數組元素。