zoukankan      html  css  js  c++  java
  • 指针高级(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;
    }
  • 相关阅读:
    install cygwin
    Case When PK PIVOT
    SQL Server 2012 Features
    XMLHttpRequest 使用概括
    Html DOM 常用属性和方法
    Rewrite Path in Asp.Net MVC Project
    cefsharp
    线程
    ftp 相关知识集合
    数据库知识集合
  • 原文地址:https://www.cnblogs.com/0515offer/p/4552147.html
Copyright © 2011-2022 走看看