一、指針的運算
1.1加法
? ? ? ?對指針可以進行加法運算,即p + n或者p - n。其結果依舊是一個是一個指針,新的指針是在原來的地址值基礎上加上/減去n *(sizeof(指針指向的數據類型))個字節。??
? ? ? ?指針也可以進行自增,即*(p ++)或*(++p)或*++p(單目運算符自右向左運算)。(*p)++? 他表示指針的內容自增,而不是指針本身。
? ? ? ?指針之間不能進行加法求和(沒意義)。
1.2減法
? ? ? ?指針和指針之間可以進行減法運算,但是要保證兩種(指針指向的數據類型)一致并且必須指向同一數組,結果為(p1地址 - p2地址) / sizeof(指針類型),即表示兩個變量差幾個基類型。
?
二、指針與數組 ?
? ? ? 指針能表示數組主要基于數組的單一性、連續性與有序性。
2.1 空指針
? ? ? 在編程中,空指針?是一個特殊的指針值,表示該指針不指向任何有效的內存地址。它通常用于表示 “無指向”“未初始化” 或 “無效引用” 的狀態(NULL)。
? ? ? 指針聲明時若未確定指向,通常初始化為空指針,避免成為 “野指針”(指向隨機內存的危險指針),空指針避免野指針意外修改重要數據。可通過判斷指針是否為空,避免無效操作
2.2 迭代器
? ? ? ?數組元素在內存中連續存儲,指針可以通過地址偏移實現高效遍歷。例如:
int a[] = {1, 2, 3, 4, 5};
int len = sizeof(a) / sizeof(a[0]);
int* i; for (i = a; i < len - 1; i++)
{printf("%d ", *i);
}
// 輸出:1 2 3 4 5
2.3 一維數組
(1)遍歷
對一維數組完成遍歷
void printArray(int *a,int len)
{int i;for(i = 0;i < len;++i){ printf("%d\n", *(a + i));}}int main(void)
{int a[] = {0,1,2,3,4,5,6,7,8,9};int len = sizeof(a) / sizeof(a[0]);printArray(a,a + len - 1);return 0;}
(2)逆序
對一維數組內容完成逆序
void reverse(int *a, int len)
{int i;for(i = 0;i < (len / 2); ++i){int t;t = *(a + i);*(a + i) = *(a + len - i - 1);*(a + len - i - 1) = t;}
}int main(void)
{int a[] = {1,2,3,4,5,6,7,8,9,0};int len = sizeof(a) / sizeof(a[0]);reverse(a,a + len - 1);return 0;
}
(3)排序(選擇排序)
對數組進行選擇排序:
void swap(int *a,int *b)
{int t;t = *a;*a = *b;*b = t;
}
void choiceSort(int *a,int len)
{int i,j;for(i = 0;i < len - 1;++i){for(j = i + 1;j < len;++j){if(*(a + i) > *(a + j) ){swap((a + i),(a + j));}}}}int main(void)
{int a[] = {1,2,3,4,5,6,7,8,9,0};int len = sizeof(a) / sizeof(a[0]);choiceSort(a,a + len - 1);return 0;}
2.4 qsort(快速查找)
? ? ? ? 下列代碼通過“選基準→分區→遞歸排序子數組”的步驟,實現了快速排序算法,最終將 [begin, end] 區間的元素按升序排列。
void qSort(int *begin,int *end)
{if(begin >= end){return ;}int t = *begin;int *p = begin;int *q = end;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,3,4,5,6,7,8,9,0};int len = sizeof(a) / sizeof(*a);qSort(a,a + len - 1);printArray(a,a + len - 1);return 0;
}
2.5 二分查找
int *binaryFind(int *begin, int *end,int n)
{while(begin <= end){int *mid = (end - begin) / 2 + begin;if(*mid > n){end = mid - 1;}else if(*mid < n){begin = mid + 1;}else{return mid;}}return NULL;
}int main(void)
{int a[] = {1,2,3,4,5,6,7,8,9,0};int len = sizeof(a) / sizeof(*a);choiceSort(a,a + len - 1);int *ret = binaryFind(a,a + len -1,4);if(ret){printf("Found\n");}else{printf("No Found\n");}return 0;
}
?
2.6 字符型數組
遍歷與查找有效字符
void Puts(char *s)
{while(*s != '\0'){putchar(*s);++s;}putchar('\n');
}int Strlen(char *s)
{int counter = 0;while(*s){++s;++counter;}return counter;
}
int main(void)
{char s[] = {"Hello"};//Puts(s + 1);printf("%d\n",Strlen("Hello World!"));return 0;
}
? ?
?