20150604高级指针及函数指针

本文深入探讨了C语言中指针的基本概念与高级应用,包括指针数组、数组指针、函数指针及其应用场景,旨在帮助读者理解这些复杂概念。

 main.c文件

//

//  main.c

//  IOS150604

//

//  Created by Peng Junlong on 15/6/4.

//  Copyright (c) 2015 Peng Junlong. All rights reserved.

//


//*************************

//*                       *

//*         高级指针        *

//*                       *

//*************************


#include <stdio.h>


//指针的数组(指针数组)

//本质是数组,数组中的每一个元素都是一个指针变量

//int *p[10];保存地址

//p[0]~p[9]都是一个int * 指针


//输入单词并输出


//使用栈内存

//int main(int argc, const char * argv[]) {

//    char *ps[10] = {NULL};

//    int count = 0;

//    char str[10][100];  //  让指针数组中的每一个指针都指向一个地址

//    for(int i=0;i<10;i++)

//    {

//        ps[i] = str[i]; //若无此语句则指针ps[i]不指向任何地址

//        scanf("%s",ps[i]);

//        count++;

//        if (getchar() == '\n') {

//            break;

//        }

//    }

//    for (int i=0; i<count; i++) {

//        printf("%s\n",ps[i]);

//    }

//    return 0;

//}


//使用堆内存

//#include <stdlib.h>

//int main(int arg , const char *argv[])

//{

//    char *ps[10] = {NULL};

//    int count = 0;

//    for(int i=0;i<10;i++)

//    {

//        ps[i] = (char *)malloc(100*sizeof(char));

//        if (!ps[i]) {

//            return -1;

//        }

//        scanf("%s",ps[i]);

//        count++;

//        if (getchar() == '\n') {

//            break;

//        }

//    }

//    for (int i=0; i<count; i++) {

//        printf("%s\n",ps[i]);

//        free(ps[i]);

//        ps[i] = NULL;

//    }

//    return 0;

//}


//利用指针数组求二维数组元素的和


//int sum(int *array[],int rlength,int clenght)//*array[]也可写成**array

//{

//    int sum = 0;

//    for (int i=0; i<rlength; i++) {

//        for (int j=0; j<clenght; j++) {

//            sum += array[i][j];

////            sum += (*(a+i)[j]);

////            sum += *(*(a+i)+j);

//        }

//    }

//    return sum;

//}

//int main(int arg ,const char *argv[])

//{

//    int a[3][2] = {1,2,3,4,5,6};

//    int *p[3] = {NULL};

//    for (int i=0; i<3; i++) {

//        p[i] = a[i];     //一定要让指针数组中的指针指向一个地址;指针数组中的每一个指针指向二维数组中的行的首地址

//    }

//    printf("Sum = %d\n",sum(p, 3,2));

//    return 0;

//}


//数组的指针(数组指针)

//数组类型的指针,本质是指针变量,数据类型是数组类型的

//int (*p)[3];-->int (*)[3]

//p是一个指向有三个元素的一维数组的指针


//分析二维数组数据类型

//&a[0]

//int a[5][4] -->int (*&a[5])[4] -->int (*)[4]


//a[0]

//int a[5][4] -->int a[0][4] -->int [4] -->int *


//a

//int a[5][4] -->int [5][4] -->int (*)[4] // 一维数组指针,a+1表示二维数组的下一行(即下一个一维数组的首地址)


//&a

//int a[5][4] -->int (*&a)[5][4] -->int (*)[5][4]   // 二维数组指针


//&a[0][0]-->int *


//传递一维数组的指针

//int sum1(int (*p)[4],int rlenght)   //

//{

//    int sum =0;

//    for (int i=0; i<rlenght; i++) {

//        for (int j=0; j<4; j++) {

//            sum += *(*(p+i)+j);

//        }

//    }

//    return sum;

//}

//

////传递二维数组的指针

//int sum2(int (*p)[3][4])    //*p类型是int [3][4] -->int (*)[4];一维数组的指针

//{

//    int sum = 0;

//    for (int i=0; i<3;i++) {

//        for (int j=0; j<4; j++) {

//            sum += *(*(*p+i)+j);

//        }

//        

//    }

//    return sum;

//}

//int main(int arg ,const char *argv[])

//{

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

//    int (*p)[4];

//    for (int i=0; i<3; i++) {

//        p = a+i;

//        printf("%p\n",p);   //每加1地址加4*4个字节

//        for (int j=0; j<4; j++) {

//            printf("%d\n",*(*p+j));

//        }

//    }

//    printf("Sum = %d\n",sum1(a, 3));

//    printf("Sum = %d\n",sum2(&a));

//    return 0;

//}




functionPointer.c文件

//

//  functionPointer.c

//  IOS150604

//

//  Created by Peng Junlong on 15/6/4.

//  Copyright (c) 2015 Peng Junlong. All rights reserved.

//


#include <stdio.h>


//*************************

//*                       *

//*         函数指针       *

//*                       *

//*************************


//函数指针 (一定要掌握)

//函数类型的指针

//int (*pfunc)(int ,int) -->函数指针的类型int (*)(int ,int)

//int (*pfunc)(void)

//void (*pfunc)(void)

//函数名是函数指针类型的


//int add(int a, int b)

//{

//    return a+b;

//}

//

//int sub(int a, int b)

//{

//    return a-b;

//}

//

//int main(int arg,const char *argv[])

//{

//    int a = 10;

//    int b = 20;

//    int (*pfunc)(int ,int) = add;

//    printf("%d\n",add(a,b));

//    printf("%p\n",add);

//    printf("%p\n",pfunc);

//    printf("%d\n",pfunc(a,b));

//    pfunc = sub;

//    printf("%d\n",pfunc(a,b));

//    return 0;

//}


//函数指针数组

//int (*pfunc[5])(int,int)

//#include <string.h>

//

//void run(void)

//{

//    printf("狗在跑\n");

//}

//

//void eat(void)

//{

//    printf("狗在吃\n");

//}

//void sleeping(void)

//{

//    printf("狗在睡觉\n");

//}

//void bark(void)

//{

//    printf("狗在叫\n");

//}

//void tail(void)

//{

//    printf("狗在摇尾巴\n");

//}

//int main(int arg ,const char *argv[])

//{

//    char order[20]={};

//    scanf("%s",order);

//    char *strAction[5] = {"run","eat","sleeping","bark","tail"};

//    void (*dogAction[5])(void) = {run,eat,sleeping,bark,tail};

//    for (int i=0; i<5; i++) {

//        if (!strcmp(order, strAction[i])) {

//            dogAction[i]();

//        }

//    }

//    

//    return 0;

//}



//回调函数:用函数指针作为形参来调用其他函数

//回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,

//当这个指针被用来调用其所指向的函数时,我们就说这是回调函数

//void print_Hello(void)

//{

//    printf("Hello\n");

//}

//void print_World(void)

//{

//    printf("World\n");

//}

//void print_Welcome(void)

//{

//    printf("Welcome\n");

//}

//

//void print(void (*p)(void),int count)

//{

//    for (int i=0; i<count; i++) {

//        p();

//    }

//}

//int main(int arg ,const char *argvp[])

//{

//    print(print_Hello,2);

//    print(print_World,3);

//    print(print_Welcome,4);

//    return 0;

//}


#include <stdlib.h>

//最后一个字符以@结束

//unsigned long my_strlen(char *str)

//{

//    int i=0;

//    while (str[i] != '\0') {

//        i++;

//    }

//    return i;

//}

//

//int main(int arg ,const char *argv[])

//{

//    char *pstr[10]={NULL};

//    int count =0;

//    for (int i=0; i<10; i++) {

//        pstr[i] = (char *)malloc(100*sizeof(char));

//        if(!pstr[i])

//        {

//            return -1;

//        }

//        scanf("%s",pstr[i]);

//        int len = (int)my_strlen(pstr[i]);

//        if (pstr[i][len-1] == '@') {

//            pstr[i][len-1] = '\0';

//        }

//        count++;

//        if(getchar() == '\n')

//            break;

//    }

//    //printf("%d\n",(int)my_strlen("hello"));

//    for (int i=0; i<count; i++) {

//        printf("%s\n",pstr[i]);

//    }

//    

//    return 0;

//}


//二级指针(指向指针的指针)

//int a = 100;

//int *p = &a;

//int **q = &q;


//int main(int arg ,const char *argv[])

//{

//    int a = 100;

//    int *p = &a;

//    int **q = &p;

//    printf("%p\n",&a);

//    printf("%p\n",p);

//    printf("%p\n",*q);

//    

//    printf("%p\n",&p);

//    printf("%p\n",q);

//    

//    printf("%d\n",a);

//    printf("%d\n",*p);

//    printf("%d\n",**q);

//    return 0;

//}


//应用二级指针交换两个变量的值


//void swap(int **a,int **b)

//{

//    int temp;

//    temp = **a;

//    **a = **b;

//    **b = temp;

//}

//

//int main(int arg ,const char *argv[])

//{

//    int a = 100;

//    int b = 200;

//    int *pa = &a;

//    int *pb = &b;

//    printf("a = %d,b=%d\n",a,b);

//    swap(&pa,&pb);

//    printf("a = %d,b=%d\n",a,b);

//    return 0;

//}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值