指针用法(一)
引子
思考以下几个小问题:
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;
}
运行结果
慢慢写,下班了。