指针高级(2)

//
//  main.c
//  指针高级
//
//  Created by zhangxueming on 15/6/4.
//  Copyright (c) 2015年 zhangxueming. All rights reserved.
//

#include <stdio.h>
//指针的数组(指针数组)
//本质是数组, 数组中的每一个元素都是指针变量
//int *p[10];
//p[0]~p[9] 都是一个 int *指针变量

//定义一个一维字符指针数组,并利用不定数量(不多于10)个字符串将其初始化,然后将各字符串输出。
//比如:
//输入
//asdfw uuio fff tyu
//
//输出为
//tyu
//fff
//uuio
//asdfw

//str[0]
//char str[10][100]--> char [100] --> char *

//int main(int argc, const char * argv[]) {
//    char *ps[10]={NULL};
//    char str[10][100]={};//str[0]   &str[0][0]  char *
//    int cnt=0;
//    for (int i=0; i<10; i++) {
//        ps[i]= str[i];
//        scanf("%s",ps[i]);
//        cnt++;
//        if (getchar()=='
') {
//            break;
//        }
//    }
//    for (int i=0; i<cnt; i++) {
//        printf("%s
", ps[i]);
//    }
//    return 0;
//}
#include <stdlib.h>

//int main(int argc,const char *argv[])
//{
//    char *ps[10]={NULL};
//    int cnt=0;
//    for (int i=0; i<10; i++) {
//        ps[i]=(char *)malloc(100*sizeof(char));
//        if (!ps[i]) {
//            return -1;
//        }
//        scanf("%s", ps[i]);
//        cnt ++;
//        if (getchar()=='
') {
//            break;
//        }
//    }
//    for (int i=0; i<cnt; i++) {
//        printf("%s
", ps[i]);
//        free(ps[i]);
//        ps[i]=NULL;
//    }
//    return 0;
//}

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

//int sum(int *p[], int len1, int len2)
//{
//    int sum=0;
//    for (int i=0; i<len1; i++) {
//        for (int j=0; j<len2; j++) {
//            //sum+=p[i][j];// p[i][j] --> *((*(p+i))+j)
//            //sum+=(*(p+i))[j];
//            sum += *((*(p+i))+j);
//        }
//    }
//    return sum;
//}
//
//int main(int argc,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
", sum(p,3,2));
//    
//    return 0;
//}


//数组的指针(数组指针)
//数组类型的指针,本质是指针变量,数据类型是数组类型的
//int (*p)[3]; --> int (*)[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
//int a[5][4] <==> int (*&a)[5][4] --> int (*)[5][4]

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


//int main(int argc,const char *argv[])
//{
//    //printf("size = %ld
", sizeof(int [5]));
//    
//    int a[5][4]={};
//    int (*p)[4]=a;//int (*)[4]  int *
//    
//    printf("%p
",p);
//    p++;
//    printf("%p
",p);
//    p++;
//    printf("%p
",p);
//    
//    return 0;
//}
//传递一维数组的指针
int sum1(int(*p)[2], int len)// *(int (*p)[2]) --> int [2]
{
    int sum=0;
    for (int i=0; i<len; i++) {
        for (int j=0; j<2; j++) {
            //sum+=p[i][j];
            //sum+= (*(p+i))[j];
            sum+=*(*(p+i)+j);
        }
    }
    return sum;
}
//传递二维数组的指针
int sum2(int (*p)[3][2])//*p  int [3][2] --> int (*)[2]
{
    int sum=0;
    for (int i=0; i<3; i++) {
        for (int j=0; j<2; j++) {
            //sum+= (*p)[i][j];
            sum+= *(*(*p+i)+j);
        }
    }
    return sum;
}
//int main(int argc, const char *argv[])
//{
//    int a[3][2]={1,2,3,4,5,6};
//    //printf("sum = %d
", sum1(a,3));
//    printf("sum = %d
", sum2(&a));
//    
//    return 0;
//}

//函数的指针
//函数类型的指针
//int (*pfunc)(int , int)=add; ---> 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 argc, const char *argv[])
//{
//    //printf("add = %p
", add);
//    //printf("sum = %d
", add(3, 5));
//    int (*pfunc)(int , int)=add;
//    
//    printf("sum = %d
", pfunc(3,5));
//    
//    pfunc = sub;
//    
//    printf("sub = %d
", pfunc(9,5));
//    
//    return 0;
//}

//函数指针数组
//int (*p[5])(int , int);

void run(void)
{
    printf("狗在奔跑
");
}

void eat(void)
{
    printf("狗在肯骨头
");
}

void sleeping(void)
{
    printf("狗在睡觉
");
}

void bark(void)
{
    printf("狗在咬人
");
}

void tail(void)
{
    printf("狗在摇尾巴
");
}

#include <string.h>

//int main(int argc, 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])==0) {
//            dogAction[i]();
//        }
//    }
//    return 0;
//}


//回调函数

void print_hello(void)
{
    printf("hello
");
}

void print_world(void)
{
    printf("world
");
}

void print_welcome(void)
{
    printf("welcome
");
}

void print(void(*pfunc)(void), int cnt)
{
    for (int i=0; i<cnt; i++) {
        pfunc();
    }
}

//int main(int argc,const char *argv[])
//{
//    print(print_hello, 5);
//    print(print_welcome, 4);
//    print(print_world, 5);
//    
//    return 0;
//}

//定义一个一维字符指针数组,并利用不定长字符串将其初始化,最后一段字符串以‘@’结尾,然后将各字符串输出.
//比如:
//输入
//asdfw
//dffweff@
//输出为
//asdfw
//dffweff
//
//输入
//sgfge
//asdfwwr
//wwdfaf@
//输出为
//sgfge
//asdfwwr
//wwdfaf

unsigned long my_strlen(char *str)
{
    int i=0;
    while (str[i]) {
        i++;
    }
    return i;
}


//int main(int argc,const char *argv[])
//{
//    //printf("len = %lu
", my_strlen("hello"));
//    
//    char *ps[10]={NULL};
//    int cnt=0;
//    for (int i=0; i<10; i++) {
//        ps[i]=(char *)malloc(100*sizeof(char));
//        if (!ps[i]) {
//            return -1;
//        }
//        scanf("%s", ps[i]);
//        int len = (int)my_strlen(ps[i]);
//        if (ps[i][len-1]=='@') {
//            ps[i][len-1]='';
//        }
//        cnt++;
//        if (getchar()=='
') {
//            break;
//        }
//    }
//
//    for (int i=0; i<cnt; i++) {
//        printf("%s
", ps[i]);
//        free(ps[i]);
//        ps[i]=NULL;
//    }
//    return 0;
//}

//指针函数
//函数的返回为指针类型的函数
//#include <string.h>
//
//int main(int argc,const char *argv[])
//{
//    //char    *strcpy(char *dst, const char *src);
//    return 0;
//}

//二级指针(指向指针的指针)
//int a=100;
//int *p = &a;
//int **q = &p;

//int main(int argc,const char *argv[])
//{
//    int a=100;
//    int *p = &a;
//    int **q = &p;
//    
//    printf("&a = %p
", &a);
//    printf("&a = %p
", p);
//    printf("&a = %p
", *q);
//    
//    printf("a = %d
", *p);
//    printf("a = %d
", a);
//    printf("a = %d
", **q);
//    
//    return 0;
//}

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

void  swap(int **a, int **b)
{
    int temp = **a;
    **a  = **b;
    **b = temp;
}
int main(int argc,const char **argv)
{
    int a=10, b=20;
    int *pa= &a;
    int *pb= &b;
    swap(&pa, &pb);
    printf("a = %d b = %d
", a, b);
    return 0;
}
原文地址:https://www.cnblogs.com/0515offer/p/4552147.html