一、判断计算机是大端还是小端存储
通过联合体或指针判断内存的字节序方式:
int x = 1;
char *p = (char *)&x;
if (*p == 1)
{
printf("小端存储\n");
}
else
{
printf("大端存储\n");
}
小端(Little Endian):低地址存储低位
大端(Big Endian):低地址存储高位
二、指针加法与数组操作
指针加法:
int i = 10;
int *p = &i;
p + 1; // 实际移动 sizeof(int) 字节
多用于数组:
int a[5] = {1, 2, 3, 4, 5};
int *p = a;
*(p + 2) == a[2]; // true
效率上指针和数组下标访问是一样的(编译器会优化)
三、数组逆序(使用指针实现)
void reverse(int *a, int n)
{
int *start = a, *end = a + n - 1;
while (start < end)
{
int tmp = *start;
*start = *end;
*end = tmp;
start++;
end--;
}
}
四、NULL 空指针
NULL
是一种特殊指针值,表示指针“不指向任何有效地址”
常用于函数返回失败、链表结尾、初始化指针等场景
五、指针比较与差值
指针支持比较运算(如 <
, ==
, !=
)
if (p1 < p2) {...}
int diff = p2 - p1; // 差值是元素个数,不是字节数
两个指针不能直接相加(没有实际意义)
六、二分查找(使用指针实现)
int binary_search(int *a, int n, int target)
{
int *left = a, *right = a + n - 1;
while (left <= right) {
int *mid = left + (right - left) / 2;
if (*mid == target) return mid - a; // 返回下标
else if (*mid < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
七、排序算法
1. 快速排序(指针实现)
思路:选基准 → 左右找数 → 交换 → 递归左右子序列
基本结构如下:
void quick_sort(int *left, int *right)
{
if (left >= right) return;
int *l = left, *r = right;
int pivot = *left;
while (l < r)
{
while (l < r && *r >= pivot)
{
r--;
}
while (l < r && *l <= pivot)
{
l++;
}
if (l < r)
{
int tmp = *l;
*l = *r;
*r = tmp;
}
}
*left = *l;
*l = pivot;
quick_sort(left, l - 1);
quick_sort(l + 1, right);
}
2. 选择排序(可递归实现)
void selection_sort(int *a, int n)
{
if (n <= 1) return;
int *maxp = a;
for (int *p = a + 1; p < a + n; ++p)
if (*p > *maxp) maxp = p;
int tmp = *(a + n - 1);
*(a + n - 1) = *maxp;
*maxp = tmp;
selection_sort(a, n - 1);
}
3. 插入排序(指针实现)
void insertion_sort(int *a, int n)
{
for (int *i = a + 1; i < a + n; ++i)
{
int key = *i;
int *j = i - 1;
while (j >= a && *j > key)
{
*(j + 1) = *j;
j--;
}
*(j + 1) = key;
}
}