指针基础(指针数组、数组指针、函数指针、函数指针数组)

1.将多个数据的首元素地址存放在一个数组里 ---- 指针数组(整形、字符)

int main(){

    //将数组里的首元素地址存放在一个数组里 ---- 指针数组(整形、字符)
    int a = 10; int b = 20; int c = 30;
    int* parr[3] = {&a,&b,&c};

    int i = 0;
    for (i = 0; i < 3; i++){
        printf("%d\n", *(parr[i])); // 10 20 30
    }

    return 0;
}

------------------ 使用方法一般如以下 ----------------------

int main(){

  int arr1[] = { 1, 2, 3, 4, 5 };
  int arr2[] = { 2, 3, 4, 5, 6 };
  int arr3[] = { 3, 4, 5, 6, 7 };
  int* pArr[] = { arr1, arr2, arr3 };

  int i = 0;
  for (i = 0; i < 3; i++){
    int j = 0;
    for (j = 0; j < 5; j++){
      printf("%d ", *(pArr[i] + j)); // 1 2 3 4 5 \n 2 3 4 5 6 \n 3 4 5 6 7
    };
    printf("\n");
  }

  return 0;
}

 2.将一整个数组的地址存放在一个指针里 ---- 数组指针

int main(){

    // 将一整个数组的地址存放在一个指针里,如果只有一个数组的话存首元素地址最后解出来更方便
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int (*p)[10] = &arr;
    int i = 0;
    for (i = 0; i < 10; i++){  
        printf("%d ", (*p)[i]); // 1 2 3 4 5 6 7 8 9 10
        //printf("%d ", *(*p + i)); // 1 2 3 4 5 6 7 8 9 10, 注: *p == arr == 首元素地址
    }

    return 0;
}
------------------ 使用方法一般如以下 ----------------------
void print1(int arr[3][5], int x, int y){ // 参数是数组的形式
  int i = 0;
  for (i = 0; i < x; i++){
    int j = 0;
    for (j = 0; j < y; j++){
      printf("%d ", arr[i][j]); // 1 2 3 4 5 \n 2 3 4 5 6 \n 3 4 5 6 7
    }
    printf("\n");
  }
};

void print2(int (*p)[5], int x, int y){ // 参数是指针的形式 p为一整个数组的指针
  int i = 0;
  for (i = 0; i < x; i++){
  int j = 0;
    for (j = 0; j < y; j++){
      printf("%d ", (*(p + i))[j]); // 1 2 3 4 5 \n 2 3 4 5 6 \n 3 4 5 6 7
      //printf("%d ", *(*(p + i)+j)); // 1 2 3 4 5 \n 2 3 4 5 6 \n 3 4 5 6 7
    };
    printf("\n");
  };

};

int main(){

  int arr[3][5] = { {1,2,3,4,5}, {2,3,4,5,6}, {3,4,5,6,7} };
  //print1(arr, 3, 5);
  print2(arr, 3, 5);

  return 0;
}

 3.将一个函数的地址存放在指针里 ---- 函数指针

int add(int x, int y){
    int z = 0;
    z = x + y;
    return z;
};

int main(){

    // 将一个函数的地址存放在指针里,函数没有首个元素之说,&函数名 和 函数名 都是函数的地址
    int a = 10; int b = 20; 
    int (*pa)(int,int) = add;
    int tem = (*pa)(2, 3); // 对于函数来说 (*pa) 可以直接写成 pa
    printf("%d", tem); // 5

    return 0;
}

4.将一个数组用来存放函数的(指针)地址 ---- 函数指针数组

int Add(int x, int y){return x + y;}
int Sub(int x, int y){return x - y;}
int Mul(int x, int y){return x * y;}
int Div(int x, int y){return x / y;}

int main()
{
    int(*parr[4])(int, int) = {Add, Sub, Mul, Div};// 这个数组用来存放函数的(指针)地址
    
    int i = 0;
    for (i = 0; i < 4; i++){
        printf("%d\n", parr[i](2, 3));//5 -1 6 0
    }

    return 0;
}

 

posted @ 2021-08-04 14:06  封兴旺  阅读(27)  评论(0编辑  收藏  举报

联系方式: 18274305123(微信同号)