指针数组与数组指针

文章展示了C语言中的基本操作,如函数swap、快速排序qSort、数组反转、二维数组处理、递归函数、内存管理等,以及使用qsort进行排序和自定义比较函数intcmp的应用。
摘要由CSDN通过智能技术生成

#include <stdio.h>
#include <stdlib.h>
#if 0

void swap(int *a, int *b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

void qSort(int *begin, int *end)
{
    int t = *begin;
    int *p = begin;
    int *q = end;

    if(begin > end)
    {
        return ;
    }

    while(p < q)
    {
        while(p < q && *q >= t)
        {
            --q;
        }
        while(p < q && *p <= t)
        {
            ++p;
        }
        swap(p, q);
    }
    swap(p, begin);
    qSort(begin, p - 1);
    qSort(p + 1, end);
}

int main(void)
{
    const char *p = "Hello  %d %s";
    printf(p, 10, "World!");

//    int a[10] = {-1,2,-3,4,-5,6,-7,8,-9,0, };
//    int len = sizeof(a) / sizeof(*a);


//    printf("%lu\n", sizeof(int [10]));

/*    qSort(a, a + len - 1);

    int i;
    for(i = 0;i < len;++i)
    {
        printf("%d\n", a[i]);
    }
*/
    return 0;
}

void printArray2D(int (*a)[4], int rows)
{
    int i, j;
    for(i = 0;i < rows;++i)
    {
        for(j = 0;j < 4;++j)
        {
            printf("%2d ", *(*(a + i) + j));
        }
        puts("");
    }
}

void swap(int *a, int *b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

void reverse(int *begin, int *end)
{
    while(begin < end)
    {
        swap(begin, end);
        ++begin;
        --end;
    }
}

void reverse2D(int (*a)[4], int rows)
{
    int i;
    for(i = 0;i < rows;++i)
    {
        reverse(*(a + i) , *(a + i) + 3);
    }
}

int sumOfArray2D(int (*a)[4], int rows)
{
    int sum = 0,i, j;
    for(i = 0;i < rows;++i)
    {
        for(j = 0;j < 4;++j)
        {
            if(0 == i || rows - 1 == i || 0 == j || 3 == j)
            {
                sum += *(*(a + i) + j);
            }
        }
    }
}

int main(void)
{
    int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

    printf("%d\n",  *((int *)(a + 3) - 3));

/*    int rows = sizeof(a) / sizeof(*a);
    int cols = sizeof(*a) / sizeof(**a);
    
    reverse2D(a, rows);
    printArray2D(a, rows);
    */
    //a <=> &a[0]
//    int (*p)[4] = NULL;
//    p = a;

    //*(p + 1)  <=>  p[1]  a[1]   int *

//    printf("%d\n", *(*(p + 1) + 2));   //a[i][j]  <=>   *(*(a + i) + j)

    return 0;
}

#include <string.h>

int fib(int n)
{
    if(1 == n || 2 == n)
    {
        return 1;
    }
    else
    {
        return fib(n - 1) + fib(n - 2);
    }
}

int main(void)
{
    int n = 10, i;
    int *p = NULL;

    p = calloc(n , sizeof(int));

    for(i = 0;i < n;++i)
    {
        p[i] = fib(i + 1);
    }

    for(i = 0;i < n;++i)
    {
        printf("%d\n", p[i]);
    }

    int m = 20;

    p = realloc(p, m * sizeof(int));
//    int *q = malloc(m * sizeof(int));
//    memcpy(q, p, n * sizeof(int));

//    free(p);
//    p = q;

    for(i = n;i < m;++i)
    {
        p[i] = fib(i + 1);
    }

    for(i = 0;i < m;++i)
    {
        printf("%d\n", p[i]);
    }

    free(p);
    p = NULL;
    return 0;
}

int g_i;

int *fn(int *p)
{
    static int i = 100;
    return p;
}

int main(void)
{
    int i = 10;
    int *ret = fn(&i);
    
    *fn(&i) = 1000;
    printf("%d\n", i);

    return 0;
}

int add(int a, int b)
{
    return a + b;
}

int sub(int a, int b)
{
    return a - b;
}

void fn(void)
{

}

int main(void)
{
    int (*p)(int , int ) = NULL;
    
    p = sub;

    printf("%d\n", p(10, 20));
    return 0;
}
#endif

int pow2(int n)
{
    return n * n;
}

int fn(int n)
{
    return n;
}

void sort(int *a, int len, int (*pfn)(int))
{
    int i, j;
    for(i = 0;i < len - 1;++i)
    {
        for(j = i + 1;j < len;++j)
        {
            if(pfn(a[i]) > pfn(a[j]))
            {
                int t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
        }
    }
}

int div3(int n)
{
    return n % 3 == 0;
}

int div5(int n)
{
    return n % 5 == 0;
}


void printArray(int *a, int len, int (*pfn)(int))
{
    int i;
    for(i = 0;i < len;++i)
    {
        if(pfn(a[i]) != 0)
        {
            printf("%d\n", a[i]);
        }
    }
}

int intcmp(const void *p1, const void *p2)
{
    int *q1 = (int *)p1;
    int *q2 = (int *)p2;

    if(*q1 > *q2)
    {
        return 1;
    }
    else if(*q1 == *q2)
    {
        return 0;
    }
    else
    {
        return -1;
    }
}

int main(void)
{
    short a[] = {-1,2,-3,4,-5,6,-7,8,-9,0};
    int len = sizeof(a) / sizeof(*a);
    
    qsort(a, len, sizeof(*a), intcmp);

    int i;
    for(i = 0;i < len;++i)
    {
        printf("%d\n", a[i]);
    }
//    void (*pfn)(void) = (void (*)(void))(0x30008000);
//    pfn();
//    sort(a, len, pow2);
//    printArray(a, len, div5);

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值