指针用法(一)

引子

思考以下几个小问题:
1.在保存一系列对象的时候,是保存对象,还是保存对象的指针呢?
2.假设在一个函数,能不能直接使用外部自己实现的函数?
3.假设要保存的数据对象是不同的,如何放在一起?
4.可不可以通过配置一些文档之类的来写一个程序?

还有许多类似的问题。当然生活中经常听到的反射机制,回调函数,单例模式等各种东西,是什么意思呢,为什么可以这么做呢?
其实哈这些都是一些和指针之类相关的问题。
先看这样一段代码,为什么可以这样写?

#include <iostream>

void Func_1(int param1, int param2) {
  std::cout << "Func_1" << std::endl;
}

int Func_2(int param1) {
  std::cout << "Func_2" << std::endl;
  return 0;
}
int main(int argc, char* argv[]) {
  void * func_ptr = nullptr;
  if (argv[1] == "") {
    func_ptr = reinterpret_cast<void *>(&Func_1);
  } else {
    func_ptr = reinterpret_cast<void *>(&Func_2);
  }
  int test_param = 2;
  if (argv[1] == "") {
    ((void (*)(int, int))func_ptr)(test_param, test_param);
  } else {
    int ret =  ((int (*)(int))func_ptr)(test_param);
  }
  return 0;
}

这代码意思很简单,但是为什么可以这样做呢?这里涉及到的就是函数指针。函数指针还不就是指针。这里就有个概念在里面

不管是什么数据类型,什么对象,什么函数指向他们的东西就是一个指针,那么这个指针就是一样大小的东西。

这不就是一个"大一统"的概念嘛。所以说,我们可以把指针的指针做成一个“收纳箱”,可以放上一切乱七八糟的东西。
这就需要一个转换过程,那就是先将指针的指针弄成一样的东西,然后使用的时候再具体区分。

看下这段代码

#include <iostream>

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

  void** main_ptr = new void*[2];
  int* int_ptr = new int[2];
  int_ptr[0] = int_ptr[1] = 1;
  double* double_ptr = new double[2];
  double_ptr[0] = double_ptr[1] = 2;
  main_ptr[0] = int_ptr;
  main_ptr[1] = double_ptr;

  int* int_ptr_tmep = reinterpret_cast<int *>(main_ptr[0]);
  double* double_ptr_tmep = reinterpret_cast<double *>(main_ptr[1]);
  std::cout << int_ptr_tmep[0] << " " << int_ptr_tmep[1] << std::endl;
  std::cout << double_ptr_tmep[0] << " " << double_ptr_tmep[1] << std::endl;
  delete[] int_ptr;
  delete[] double_ptr;
  delete[] main_ptr;
  
  return 0;
}

运行结果

慢慢写,下班了。

posted @ 2020-11-06 18:07  cyssmile  阅读(155)  评论(0编辑  收藏  举报