c语言学习小结(day14)

一、判断计算机是大端还是小端存储

通过联合体或指针判断内存的字节序方式:

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值