常見的指針指針運算說明
1.指針與整數的加減運算
????????對指針可以進行加法運算,即p + n或者p - n。其結果依舊是一個是一個指針,新的指針是在原來的地址值基礎上加上/減去n *(sizeof(指針指向的數據類型))個字節。
示例:
#include<stdio.h>int main(void)
{int a[] = {1,2,3,4,5};int *p = a; //p指向a[0]printf("%d\n",*P); //輸出結果為1++p; //因為int占4個字節,所以地址值+sizeof(int)=4個字節printf("%d\n",*p); //輸出結果為2return 0;
}
2. 指針與指針之間的減法運算
? ? ? ? 指針和指針之間可以進行減法運算,但是要保證兩種(指針指向的數據類型)一致并且必須指向同一數組,結果為(p1地址 - p2地址) / sizeof(指針類型),即元素個數差。
示例:
#include<stdio.h>int main(void)
{int a[] = {1,2,3,4,5};int *p1 = a;int *p2 = &a[4];printf("%d\n",p2 - p1);return 0;
}
3. 指針與指針之間的關系運算
????????指針和指針之間可以進行關系運算,但是要保證兩種(指針指向的數據類型)一致或者強制類型轉換為同一類型并且必須指向同一數組。
可使用的運算符:==、!=、<、>、<=、>=。
示例:
#include<stdio.h>int main(void)
{int a[] = {1,2,3,4,5};int *p1 = a;int *p2 = a;if(p1 = p2){printf("%p=%p\n",p1,p2);}p2++;if(p1 < p2){printf("%p<%p\n",p1,p2);}return 0;
}
注意事項:
????????指針和指針之間不能進行加法、乘法、除法等運算(編譯會報錯)。
????????只有指向同一數組的指針,減法和關系運算才有意義,否則結果未定義。
????????指針與整數的加減,結果仍為指針,指向新的位置(需確保不越界訪問)。
指針算法練習
? ? ? ?1 使用不同算法打印數組
#include<stdio.h>void printArray(int *begin,int *end) //遍歷打印
{while(begin <= end){printf("%d ",begin);++begin;}
}void printArray1(int *begin,int *end) //遞歸調用打印數組
{if(begin > end){return ;}else{printf("%d ",begin);printArray1(begin + 1,end);}
}int main(void)
{int a[] = {1,2,4,3,5,7,6,8,9,10};int len = sizeof(a) / sizeof(*a);printArray(a, a + len - 1);printArray1(a,a + len - 1)return 0;}
2.使用不同算法逆序數組
#include<stdio.h>void swap(int *a,int *b) //互換
{int t;t = *a;*a =*b;*b = t;
}void reserve(int *begin,int *end)
{while(begin < end){swap(begin,end);++begin;--end;}
}void reserve1(int *begin,int *end)
{if(begin >= end){return ;}else{swap(begin,end);reserve1(begin + 1,end - 1);}
}int main(void)
{int a[] = {1,2,4,3,5,7,6,8,9,10};int len = sizeof(a) / sizeof(*a);reverse(a, a + len -1);reverse1(a, a + len -1);printArray(a,a + len - 1);return 0;
}
快速排序
?????????快速排序是一種高效的排序算法,基于“分治法”思想,通過選取一個基準元素,將數組分為兩部分(小于基準和大于基準),再遞歸排序兩部分。其平均時間復雜度為O(n log n),是實際應用中常用的排序算法。
快速排序的核心步驟
?? ?1.?? ?選擇基準(pivot):從數組中選一個元素作為基準(通常選首元素、尾元素或中間元素)。
?? ?2.?? ?分區(partition):將數組中小于基準的元素放在基準左邊,大于基準的元素放在右邊(等于基準的元素可放任意一側)。
?? ?3.?? ?遞歸排序:對基準左右兩側的子數組重復上述步驟,直到子數組長度為0或1。
#include<stdio.h>void printArray(int *begin,int *end) //遍歷打印
{while(begin <= end){printf("%d ",begin);++begin;}
}void qSort(int *begin,int *end) //快排
{ int *p = begin;int *q = end;int t = *begin;if(begin > end){return ;}else{while(p < q){while(p < q && *q >= t){--q;}while(p < q && *p <= t){++p;}swap(p, q);}swap(begin,p);qSort(begin,p - 1);qSort(p + 1,end);}
} int main(void)
{int a[] = {1,2,4,3,5,7,6,8,9,10};int len = sizeof(a) / sizeof(*a);qSort(a,a + len - 1);printArray(a,a + len - 1);return 0;
}