指针是c++中很重要的一部分内容。
可以认为,指针是C++这把宝剑最锋利的部分,当然,如果你使用不当,也会伤到自己的
本篇博客,将尝试用11级指针这个结构来存储海量的QQ号和密码。首先,郑重声明,我没有海量的QQ号和密码,只是想用这种结构来解决这个不存在的问题,不存在只是对我而言的,据称,腾讯内部的一些代码对QQ的处理就是用的这种结构
何为11级指针,其实,就是在指针前面加了11个*,加一个*就是1级指针,加两个*就是二级指针
char *********** QQptr = NULL;
指针和数组有着扯不清的关系,这个11级指针,你可以理解为11维度的数组,平日里见得最多的恐怕也就是二维数组了,11维,只能脑补了。如果QQ号长度不够10位,则在前面补0,那么这个QQ号的10位数字就可以用来做数组的下角标了,最后的那个维度我们用来存储密码。
坦率的讲,我脑子里也对这个模型很是模糊,无法建立起一个有效的概念,所以,还是直接上代码吧,或许代码比语言有更好的解释效果:
#include <iostream> using namespace std; #define POINTER_SIZE 10 int CharToInt(char ch) { return ch - '0'; } char *********** QQptr = NULL; void addQQ(char *qq,char* pass) { if(NULL==qq || NULL==pass) { return ; } if(strlen(qq)!=10) { return; } int index[10]; for(int i =0;i<10;i++) { index[i] = CharToInt(qq[i]); } if(QQptr[index[0]]==NULL) { QQptr[index[0]] = (char **********)malloc(sizeof(char*)* POINTER_SIZE); memset(QQptr[index[0]], 0, sizeof(char*)* POINTER_SIZE);//清零 } if(QQptr[index[0]][index[1]]==NULL) { QQptr[index[0]][index[1]] = (char *********)malloc(sizeof(char*)* POINTER_SIZE); memset(QQptr[index[0]][index[1]], 0, sizeof(char*)* POINTER_SIZE);//清零 } if(QQptr[index[0]][index[1]][index[2]]==NULL) { QQptr[index[0]][index[1]][index[2]] = (char ********)malloc(sizeof(char*)* POINTER_SIZE); memset(QQptr[index[0]][index[1]][index[2]], 0, sizeof(char*)* POINTER_SIZE);//清零 } if(QQptr[index[0]][index[1]][index[2]][index[3]]==NULL) { QQptr[index[0]][index[1]][index[2]][index[3]] = (char *******)malloc(sizeof(char*)* POINTER_SIZE); memset(QQptr[index[0]][index[1]][index[2]][index[3]], 0, sizeof(char*)* POINTER_SIZE);//清零 } if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]]==NULL) { QQptr[index[0]][index[1]][index[2]][index[3]][index[4]] = (char ******)malloc(sizeof(char*)* POINTER_SIZE); memset(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]], 0, sizeof(char*)* POINTER_SIZE);//清零 } if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]]==NULL) { QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]] = (char *****)malloc(sizeof(char*)* POINTER_SIZE); memset(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]], 0, sizeof(char*)* POINTER_SIZE);//清零 } if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]]==NULL) { QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]] = (char ****)malloc(sizeof(char*)* POINTER_SIZE); memset(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]], 0, sizeof(char*)* POINTER_SIZE);//清零 } if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]]==NULL) { QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]] = (char ****)malloc(sizeof(char*)* POINTER_SIZE); memset(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]], 0, sizeof(char*)* POINTER_SIZE);//清零 } if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]]==NULL) { QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]] = (char ***)malloc(sizeof(char*)* POINTER_SIZE); memset(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]], 0, sizeof(char*)* POINTER_SIZE);//清零 } if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]][index[8]]==NULL) { QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]][index[8]] = (char **)malloc(sizeof(char*)* POINTER_SIZE); memset(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]][index[8]], 0, sizeof(char*)* POINTER_SIZE);//清零 } if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]][index[8]][index[9]]==NULL) { QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]][index[8]][index[9]] = (char *)malloc(sizeof(char*)* 1024); memset(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]][index[8]][index[9]], 0, sizeof(char*)* POINTER_SIZE);//清零 } strcpy(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]][index[8]][index[9]],pass); } bool isExist(char *qq) { if(NULL==qq) { return NULL ; } if(strlen(qq)!=10) { return NULL; } int index[10]; for(int i =0;i<10;i++) { index[i] = CharToInt(qq[i]); } if(QQptr[index[0]]==NULL) { return false; } if(QQptr[index[0]][index[1]]==NULL) { return false; } if(QQptr[index[0]][index[1]][index[2]]==NULL) { return false; } if(QQptr[index[0]][index[1]][index[2]][index[3]]==NULL) { return false; } if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]]==NULL) { return false; } if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]]==NULL) { return false; } if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]]==NULL) { return false; } if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]]==NULL) { return false; } if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]]==NULL) { return false; } if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]][index[8]]==NULL) { return false; } if(QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]][index[8]][index[9]]==NULL) { return false; } return true; } char* getPass(char* qq) { if(NULL==qq) { return NULL ; } if(strlen(qq)!=10) { return NULL; } if(!isExist(qq)) { return NULL; } int index[10]; for(int i =0;i<10;i++) { index[i] = CharToInt(qq[i]); } return QQptr[index[0]][index[1]][index[2]][index[3]][index[4]][index[5]][index[6]][index[7]][index[8]][index[9]]; } int main() { QQptr = (char ***********)malloc(sizeof(char*)* POINTER_SIZE); memset(QQptr, 0, sizeof(char*)* POINTER_SIZE);//清零 char *qq = "0381084992"; char *pass = "314krtqw"; addQQ(qq,pass); cout<<getPass(qq)<<endl; return 0; }
总结
以上就是本文关于浅谈使用C++多级指针存储海量qq号和密码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
本文向大家介绍浅谈C/C++中指针和数组的不同,包括了浅谈C/C++中指针和数组的不同的使用技巧和注意事项,需要的朋友参考一下 这边先简单介绍一下内存分区。 内存按照用途划分为五个区: 1.栈区:由系统控制分配和回收。 例如定义变量 int x = 0; int *p = NULL; 变量所占的内存都是分配在栈区的。 2.堆区:由程序员管理。 在C语言中由 malloc 申请的内存,或者在C++中
多级指针概述 我们将指针变量理解为一个存储地址的变量。如果这个地址里面存储的依然是地址,那么我们就可以定义一个二维指针。通过一个二维指针,我们通过两次寻址操作就可以找到这个值。 比如我们定义一个int **p;这是一个二维指针,当编译器看到p的时候,它知道这是一个指针变量,指向一个地址;当它看到第二个的时候,它知道指向的地址里面依然还是地址。如下图所示: 如果我们将p[0]和p[1]分别指向两个字
我有一个基类,然后有两个派生类。我使用基类的指针在Vector中存储派生类对象。现在我必须打印存储在vector中的数据 如何从向量中检索对象。 如何确定检索到的对象属于哪个派生类。 在这里,我使用向量将对象存储在向量中。 int main() {
本文向大家介绍浅谈JavaScript中的this指针和引用知识,包括了浅谈JavaScript中的this指针和引用知识的使用技巧和注意事项,需要的朋友参考一下 this是javascript的一个关键字,随着函数使用场合不同,this的值会发生变化。但是总有一个原则,那就是this指的是调用函数的那个对象。 this指针在传统OO语言中,是在类中声明的,表示对象本身.在JavaScript中,
C++ 指针 指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。C++ 指针
多级指针举例 可能很多同学都执行过这个命令,ping www.baidu.com或者是ping www.qq.com,ping是一个命令,后面的网址就是它的传入参数。不同的参数会导致不同的运行结果。 下面就是我们main函数的标准写法,argc就是传入参数的个数,argv是一个字符串类型的二维指针。当我们需要传递下面四个字符串给main函数的时候,这四个是字符串的首地址不是连续的,我们就可以使用二