zoukankan      html  css  js  c++  java
  • 指针深入

    指针的数组
    本质是数组,数组中的每个元素都是指针
    int *p[10];
    占用的内存空间大小 = 指针大小 * 数组长度 = 8 * 10 = 80
    p[0]~~~~p[9] 都是 int *

    char pstr[8];//88 = 64

    0 '' NULL
    int main(int argc, const char * argv[]) {
    char *pstr[5]={NULL};//把指针数组中的每个指针变量都初始化为NULL
    for (int i=0; i<5; i++) {
    pstr[i]=(char *)malloc(1000);
    if (!pstr[i]) {
    return -1;
    }
    scanf("%s", pstr[i]);
    }

    for (int i=0; i<5; i++) {
        printf("%s
    ", pstr[i]);//%s占位符,对应跟字符串首地址
    }
    return 0;
    

    }

    char str[5][100]
    str[0] --> char *
    char str[0][100] ---> char [100] ---> char *

    int main(int argc,const char *argv[])
    {
    //char *pstr[5]={"hello","world","qian","feng","welcome"};
    char *pstr[5]={NULL};
    char str[5][100];
    for (int i=0; i<5; i++) {
    pstr[i]=str[i];//str[0]~~str[4]都是一维数组
    scanf("%s", pstr[i]);
    }

    for (int i=0; i<5; i++) {
        printf("%s
    ", pstr[i]);
    }
    return 0;
    

    }

    int main(int argc,const char *argv[])
    {
    int a[3][2];
    int p = a[0];
    //int (
    p)[2]=(&a[0]);
    printf("a[0]=%p ", a[0]);// int [2] ---> int *
    printf("a[1]=%p ", a[1]);
    printf("a[2]=%p ", a[2]);

    printf("p1 =%p
    ", p);
    p++;
    printf("p2 =%p
    ", p);
    p++;
    printf("p3 =%p
    ", p);
    
    
    
    return 0;
    

    }

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

    int sumArr(int *p[], int len1, int len2)//len1表示指针数组元素个数, len2表示指针数组元素指向的一维数组的元素个数
    {
    int sum=0;
    for (int i=0; i<len1; i++) {
    for (int j=0; j<len2; j++) {
    //sum += 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 ", sumArr(p,3,2));

    return 0;
    

    }

    数组的指针 数组指针 , 本质是一个指针 数据类型是数组数据类型
    int (p)[3] int ()[3]

    int a[5][3]
    a --> int [5][3] --> int ()[3]
    &a[0] int a[0][3] --> int (
    (&a[0]))[3] --> int ()[3]
    &a int (
    &a)[5][3] --> int (*)[5][3]
    &a[0][0] int *

    int main(int argc, const char argv[])
    {
    int (
    p)[3]=NULL;
    int a[5][3];

    p = a;//int (*)[3]
    
    printf("%p
    ", &a[0]);
    printf("%p
    ", &a[0][0]);
    printf("%p
    ", &a);
    printf("%p
    ", a);
    
    printf("%p
    ", p++);
    printf("%p
    ", p++);
    printf("%p
    ", p);
    
    
    printf("%ld
    ", sizeof(int (*)[3]));//int (*)[3]  int (*)[2]
    return 0;
    

    }

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

    if 0

    int sumArr(int (*p)[3], int len)
    {
    int sum=0;
    for (int i=0; i<len; i++) {
    for (int j=0; j<3; j++) {
    //sum+= ((p+i)+j);//p++跳过sizeof(int [3]) (p+i) int * sizeof(int)
    //sum+= (
    (p+i))[j];
    sum += p[i][j];
    }
    //printf("sum = %d ", sum);
    }
    return sum;
    }

    int main(int argc,const char *argv[])
    {
    int a[2][3]={1,2,3,4,5,6};
    printf("sum = %d ", sumArr(a, 2));

    return 0;
    

    }

    endif

    int sumArr(int (p)[3][2])//p -->int ()[2] **p-- > int *
    {
    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];
    //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
    ", sumArr(&a));
    
    return 0;
    

    }

    函数的指针
    int (*pfunc)(int, int) //保存地址 函数的入口地址

    int add(int a, int b) //add --> int (*)(int , int);
    {
    //游戏算法
    return a+b;
    }

    int sub(int a, int b)
    {
    //视频算法
    return a-b;
    }

    //.lib文件 二进制文件
    //
    int main(int argc,const char argv[])
    {
    int (
    pfunc)(int, int);
    pfunc = add;

    printf("%p
    ", add);
    printf("%ld
    ", sizeof(int (int ,int)));
    printf("add = %d
    ", add(3, 5));
    //pfunc++;
    //printf("%p
    ", pfunc);
    
    printf("add = %d
    ", pfunc(3,5));
    pfunc = sub;
    printf("sub = %d
    ", pfunc(10,5));
    
    return 0;
    

    }

    //dog
    //1.void eat(void) 2.void drink(void) 3.void run(void) 4.void jump(void)

    //"eat drink run jump"

    if 0

    void eat(void)
    {
    printf("dog is eating ");
    }

    void drink(void)
    {
    printf("dog is drinking ");
    }

    void run(void)
    {
    printf("dog is running ");
    }

    void jump(void)
    {
    printf("dog is jumping ");
    }

    include <string.h>

    int main(int argc,const char argv[])
    {
    char order[50]={};
    scanf("%s", order);
    void (
    porder)(void)=NULL;
    char action[4]={"eat","drink","run","jump"};
    void (
    index[4])(void) ={eat, drink,run,jump};

    for (int i=0; i<4; i++) {
        if (strcmp(order, action[i])==0) {
            porder =index[i];
            //porder();
            index[i]();
        }
    }
    return 0;
    

    }

    endif

    回调函数

    void printHello(int value)
    {
    printf("hello --- %d ", value);
    }

    void printWorld(int value)
    {
    printf("world --- %d ", value);
    }

    void printWelcome(int value)
    {
    printf("welcome --- %d ", value);
    }

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

    int main(int argc,const char *argv[])
    {
    print(printHello, 5,1);
    print(printWelcome, 5,2);
    print(printWorld, 5, 3);

    return 0;
    

    }

    二级指针

    int main(int argc,const char *argv[])
    {
    int a=10;
    int *p = &a;
    int **q = &p;

    printf("a = %d
    ", *p);
    printf("%p
    ", *q);//*q == &a
    printf("%p
    ", &a);
    
    printf("%p
    ", &p);
    printf("%p
    ", q);
    
    printf("%d
    ", **q);
    printf("%d
    ", *p);
    
    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, *pb = &b;
    swap(&pa, &pb);
    printf("a = %d b = %d ", a, b);
    return 0;
    }

    yuirtyui@ dfghj@ ertyui dfghjk@
    yuirtyui dfghj ertyui dfghjk

    include <stdlib.h>

    include <string.h>

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

    for (int i=0; i<cnt; i++) {
        printf("%s
    ", pstr[i]);
    }
    //printf("
    ");
    
    return 0;
    

    }

    int main(int argc,const char *argv[])
    {
    char str[100]={};
    //scanf("%[^ ]", str);//只有' '字符不能作为字符串的元素
    gets(str);

    //scanf("%[A-Z,a-z,0-9]",str);
    
    printf("%s
    ",str);
    return 0;
    

    }

    泛型算法实现
    实现一个函数,能够排序int 类型数组 long数组 char类型数组 float类型数组

    include <math.h>

    int compareInt(void *a, void *b)
    {
    return *(int )a -(int *)b;
    }

    int compareLong(void *a, void b)
    {
    long val =
    (long *)a - *(long *)b;
    if (val==0) {
    return 0 ;
    }
    else if(val < 0)
    {
    return -1;
    }
    else
    {
    return 1;
    }
    }

    int compareFloat(void *a, void *b)
    {
    float f = *(float )a -(float *)b;
    if (fabs(f) <0.00005) {
    return 0;
    }
    else if(f<0)
    {
    return -1;
    }
    else
    {
    return 1;
    }
    }

    int compareChar(void *a, void *b)
    {
    return *(char *)a - *(char *)b;
    }

    void sortArr(int (*compare)(void *, void *), int size, int len)
    {

    //memcpy
    

    }

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

    return 0;
    

    }

    让明天,不后悔今天的所作所为
  • 相关阅读:
    php跨平台总结 常用预定义常量
    HDU 2065 "红色病毒"问题 (指数母函数 && 泰勒级数)
    ZOJ 3662 Math Magic (2012 Changchun Regional; LCM,DP)
    HDU 2065 "红色病毒"问题 (指数母函数 && 泰勒级数)
    状态压缩DP棋盘模型总结
    HDU 3033 I love sneakers! (分组背包变形)
    状态压缩DP棋盘模型总结
    ZOJ 3662 Math Magic (2012 Changchun Regional; LCM,DP)
    POJ 2671 Jimmy's Bad Day ★ (区间DP)
    HDU 3033 I love sneakers! (分组背包变形)
  • 原文地址:https://www.cnblogs.com/-yun/p/4263124.html
Copyright © 2011-2022 走看看