范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

我整理了这篇指针的知识点,想必对你有用

  指针和引用的区别非空区别: 任何情况下都不能使用指向空值的引用,一个引用必须总是指向某些对象。指针可以指向空。 合法性区别: 引用在使用之前不需要测试合法性,指针应该总是要被测试,防止其为空 可修改性区别: 引用在初始化时指定对象,以后不能修改。 指针传递动态内存
  例1: 程序测试后会有什么结果? #include #include using namespace std;  void getMemory(char*p, int num) {     p = (char*)malloc(sizeof(char) * num); }  int main(int argc, const char* argv[]) {     char *str = NULL;     getMemory(str, 100);     strcpy(str, "hello");     return 0; }
  问题出现在getMemory里,编译器总是为函数的每个参数制作一个临时副本。在本题中,p为str的拷贝,p申请了一个新的内存空间,但是并没有影响到str,str还是NULL,再调用strcpy(), 则会使代码崩溃,并且p申请的内存也一直没用释放,造成内存泄露。
  正确的方法是把往getMemory内传入str的地址。 #include #include using namespace std;  void getMemory(char**p, int num) {     *p = (char*)malloc(sizeof(char) * num); }  int main(int argc, const char* argv[]) {     char *str = NULL;     getMemory(&str, 100);     strcpy(str, "hello");     cout << str << endl;     return 0; }
  不过这样写有些麻烦,我们可以直接把申请好的内存返回。 #include #include using namespace std;  char* getMemory(int num) {     return (char*)malloc(sizeof(char) * num); }  int main(int argc, const char* argv[]) {     char *str = NULL;     str = getMemory(100);     strcpy(str, "hello");     cout << str << endl;     return 0; }
  例2: 这个函数有什么问题? char* strA() {     char str[] = "hello world";     return str; }
  str里存的地址是函数strA栈帧里"hello world"的首地址,函数调用完成,临时空间被重置。
  如果要获得正确的函数,可以这样写: char* strA() {     char *str = "hello world";     return str; }
  首先要搞清楚char str[], char* str,
  char str[] 分配的是一个局部数组,
  char* str 分配的是一个指针遍历,
  局部数组是局部变量,它对应的是内存中的栈。指针变量是全局变量,它对应的是内存中的全局区域。
  不过上述代码只能c语言这么写,c++不允许
  ISO C++ forbids converting a string constant to ‘char*’
  可以这么写: char* strA() {     static char str[] = "hello world";     return str; }
  例3: 下面代码的输出结果是什么? #include using namespace std;  class A { public:     A() { m_a = 1; m_b = 2; }     ~A(){}     void fun() { printf("%d%d", m_a, m_b);} private:     int m_a;     int m_b; };  class B { public:     B() {m_c = 3;}     ~B();     void fun() {printf("%d", m_c);} private:     int m_c; };   int main(int argc, const char* argv[]) {     A a;     B *pb = (B*)(&a);     pb->fun();     return 0; }
  这道题的目的就是考察你对内存偏移的理解,
  B* pb = (B*)(&a);, 这是一个野蛮的转换,强制把a地址内容看成一个B类的对象,pb指向的是a类的内存空间, 把a类空间按照B类的结构来解读。
  函数指针
  例1: 找出下列程序的错误 #include using namespace std;  int Max(int x, int y) { 	return x > y ? x : y; }  int main(int argc, char const *argv[]) { 	int *p = &Max; 	cout << p(2, 1) << endl; 	return 0; }
  这道程序存在着函数指针的错误使用问题,正确的写法为: int (*p)(int, int) = &Max;
  int *p p 是int 型的指针
  int *p(int, int), p是一个函数,返回值为int*
  int (*p)(int, int), p是一个指针,指向函数的地址,函数的返回值为int
  例2: 下面的数据声明都代表什么? float(**def)[10]; double*(*gh)[10]; double(*f[10])(); int*((*b)[10]); long(*fun)(int) int(*(*F)(int, int))(int)
  答案如下: float(**def)[10];  // def是二级指针,指向一级指针,一级指针指向数组,数组的大小为10,数组元素类型为float double*(*gh)[10];  // gh是一级指针,指向一个数组,数组大小为10,数组元素的类型为 double* double(*f[10])();  // f是一个数组,数组大小为10,数组的元素类型为指针,指针指向的类型为 double() 的函数 int*((*b)[10]);  // b是一个指针,指向一个数组,数组的大小为10,数组元素的类型为int* long(*fun)(int)  // fun是一个函数指针,指向 long(int) 型的函数 int(*(*F)(int, int))(int)  // F是一个指针,指向一个函数,函数的参数为(int, int), 函数的返回值是一个指针,指向一个函数,函数的参数为(int), 函数的返回值为int指针数组和数组指针
  例1: 以下程序的输出是什么? #include using namespace std;  int main(int argc, char const *argv[]) {     int v[2][10] = {         {1,2,3,4,5,6,7,8,9,10},         {11,12,13,14,15,16,17,18,19,20},     };     int (*a)[10] = v;       // 数组指针是一个二级指针     cout << a << endl;      // a是一个指针,指向 {1,2,3,4,5,6,7,8,9,10}     cout << *a << endl;     // *a也是一个指针,指向 1 的地址     cout << **a << endl;    // **a 取 1的值      cout << a + 1 << endl;  // 指针向后偏移一个位置,这个位置的长度为指针所指容量的大小,偏移后指向 {11,12,13,14,15,16,17,18,19,20}     cout << *(a + 1) << endl;  // 和*a的原理是一样的,指向11的地址     cout << **(a + 1) << endl;  // 取11的值      cout << *a + 1 << endl;  // *a指向1的地址,*a + 1, 指针向后偏移一个位置,*a指向的是int型的数据m, 向后偏移sizeof(int),指向2     cout << *(*a+1) << endl;  // 取2     return 0; }
  例2: 用变量a给出下面的定义 一个整型数。 一个指向整型数的指针。 一个指向指针的指针,它指向的指针是一个指向一个整型数 一个有10个整型数的数组 一个有10个指针的数组,该指针是指向一个整型数的 一个指向有10个整型数数组的指针 一个指向函数的指针,该函数有一个整型参数并返回一个整型数 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
  答案: // 1 int a; // 2 int *a; // 3 int **a; // 4 int a[10]; // 5 int *a[10]; // 6 int (*a)[10]; // 7 int (*a)(int); // 8 int (*a[10])(int);
  例3: 写出如下程序片段的输出 int a[] = {1,2,3,4,5}; int *ptr = (int*)(&a + 1); printf("%d %d", *(a+1), *(ptr - 1));
  答案: #include #include using namespace std;  int main(int argc, char const *argv[]) {     int a[] = {1,2,3,4,5};     int *ptr = (int*)(&a + 1);      cout << a << endl;  // 数组名的一个指向数组元素的常量指针     cout << &a << endl;  // &a 并不是一个指向常量指针的指针,而是一个指向整个数组的指针      // 以下两行验证以上的观点     cout << a + 1 << endl;     cout << &a + 1 << endl;      // 所以 a + 1 指向2,*(a+1) 为2     // &a + 1 应该指向5的下一个元素,ptr - 1 指向5     printf("%d %d", *(a+1), *(ptr - 1));     return 0; }迷途指针和野指针
  迷途指针 : 指针指向一个内存,这个内存会回收了,但是没有对这个指针做处理,没有将指针设为空
  野指针 : 声明了一个指针,没有将指针初始化。
  例1: 下面的程序输出结果是什么? #include using namespace std;  int main(int argc, char const *argv[]) {     char s1[] = "hello";     char s2[] = "the";     char s3[] = "world";     char* a[] = {s1, s2, s3};     char **pa = a;     pa++;     cout << *pa << endl;     return 0; }
  a 是一个常量指针,指向数组的首地址,pa++, 向后挪一个指针大小,指向s2, 输出 "the" 指针和句柄
  句柄是一个整数,是操作系统在内存中维护的一个对象,内存物理地址列表的整数索引,因为操作系统在内存管理时经常会将当前空闲对象的内存释放掉,当需要访问时再重新提交到物理内存,所以对象的物理地址是变化的,不允许程序直接通过物理地址来访问对象。程序将想访问的对象的句柄传递给系统,系统根据句柄检索自己维护的对象列表就能知道程序想访问的对象及其物理地址了。
  句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址,应用程序启动后,组成这个程序的各对象是驻留在内存的。如果简单的理解,似乎我们只要知道内存的首地址,那么就可以随时用这个地址访问对象。但是,如果真的这样认为,那么就大错特错了,我们知道,操作系统是一个以虚拟内存为基础的,存在换页现象,对象移动意味着它的地址变化了,如果地址总是变化,我们该怎么寻找对象呢?为了解决这个问题,操作系统为各应用程序腾出一些内存地址,用来专门登记各应用对象在内存中的地址变化,而登记的地址是不变的,操作系统移动对象后,将对象的地址告诉给句柄,通过句柄就能知道对象具体的位置了。
  句柄--> 登记对象地址的地址 --> 对象的地址 --> 对象
  程序每次重新启动,系统不保证分配给这个程序的句柄还是原来的句柄,就好比去电影院每次卖给我们的都不是同一个座位。 this 指针
  关于this指针,有这样一段描述: 当你进入一个房子后,你可以看见桌子,椅子,等,但是你看不到全貌了
  对于一个类的实例来说,你可以看到成员函数,成员变量,但是实例本身呢?this指针就是这样一个指针,时时刻刻指向实例本身 this 指针本质是一个函数参数,只是编译器隐藏起来的,语法层面的参数,实际上,成员函数默认第一个参数为 T* const this this 在成员函数的开始前构造,结束后清除。
  a.func(10); 会被编译器编译成 A::func(&a, 10);, 看起来和静态函数没区别,不过,区别还是有的。编译器通常会对this指针做一些优化,this指针的传递效率比较高,如VC通常是通过ecx寄存器传递。 this指针并不占用对象空间,this相当于非静态成员函数的一个隐含的参数,不占对象空间。 this指针存放在何处?this指针会因编译器不同而有不同的位置,可能是堆,栈,也可能是寄存器。 this指针是如何传递给类中的函数的?大多数编译器是通过ecx寄存器传递this指针,事实上,这也是一个潜规则,一般来说,不同编译器都会遵从一致的传参原则,否则不同的编译器产生的obj就无法匹配了 我们只有获得一个对象后,才能通过对象使用this指针,如果我们知道对象this的位置,可以直接使用吗?
  this指针只有在成员函数中才有定义。因此,你获得一个对象后,也不能通过对象使用this指针,只有在成员函数内才有this

两头承压的宁德时代们随着新能源汽车的渗透加快,对于动力电池的需求也爆发式扩展,从发展阶段来看,动力电池的厂商和品牌,将在未来继续面临两个周期性的挤压。一个是整车汽车企业的产销的快速扩大,一个是原材料端特斯拉幕后的华人老板,仅次于马斯克,个人身价飙到535亿元2022年5月初,美国特斯拉公司市值达到8968亿美元,折合人民币约5。97万亿元。在新能源产业的风口下,特斯拉公司汽车虽然不是卖得最多的,但已然成为了全球市值最高的汽车公司,市值位图排序算法实践一。算法介绍排序算法是计算机专业必学的内容,教科书里介绍的像冒泡排序,插入排序,Shell排序,堆排序,快速排序等几种经典的排序算法,其中快速排序最为推荐和广为人知,其采用二分分组java代码块详解普通代码块1。代码化块又称为初始化块,属于类中的成员即是类的一部分,类似于方法,将逻辑语句封装在方法体中,通过包围起来。2。相当于另外一种形式的构造器(对构造器的补充机制),可以做5G加速赋能千行百业中国电信中国联通近日宣布,将在100个以上主要城市开通5G新通话超清视频语音通话服务(VoNR)。日前,中国移动也表示将试用VoNR。数据显示,目前中国累计建成开通5G基站155。曾经火遍大街小巷的卡片机还记得吗?十年之前,记得满大街还都是它的天下,那个时候的手机普遍都还是30w像素,所以那个时候照相,还正是从胶片相机到数码相机过度的时期。说到数码相机,就不得不说那个时候非常火的卡片机了。卡vivoX80Pro入手体验5月7号,心心念念预订的vivox80pro终于到手了,就迫不及待开箱感受一下了,别说手握感极好,即使单手操作,毫无不适感,我选的是旅程色,开箱确实有点惊艳到我了,比发布视频的既视DJIMini3Pro的首个飞行视频在油管发布在周五出现了大疆尚未发布的Mini3Pro开箱视频后,新的无人机飞行视频也不可避免地上线了。Mini3Pro被试飞的视频是在开箱视频几个小时后上传的。由达伦麦克哈迪(DarrenM没打1毛钱广告,3年用户400万,帮10万人脱单,他是怎么做到的?作者丨沈三编辑丨信陵图源丨摄图网图虫创意叫我二狗就好,大家都这么叫!这是加上创始人微信,收到的第一句话。深圳加速脱单科技公司,创始人李二狗,腾讯出身,运营着一个年轻人婚恋交友平台二比特币可不可靠比特币比特币比股票期货凶猛百倍我还是建议中国人最好不要碰比特币,比特币抓住人性的贪婪与侥幸,跟非法传销性质相似,刚进去让你尝点甜头,后面就让你倾家荡产,在所有投机行业里,比特币是最985本科手握互联网大厂offer,毕业前一个月被开除,做事要守规矩一位手握互联网大厂offer的985高校本科毕业生(C9高校),在毕业前一个月被学校开除了,非常震惊,以为出了什么大事被开除了原来是怕麻烦翻了船。被开除是拿不到毕业证与学位证的,随
美国租车平台Avis财报碾压预期引发对冲基金空头仓皇逃窜财联社(上海,编辑史正丞)讯,当地时间周二,美国汽车租赁股AvisBudget(安飞士)创造了又一个游戏驿站式的典型逼空故事。引发市场震动的是公司的三季报,在夏季旺盛租车需求和市场三季报总结供需改善涨价潮头部轮胎企业四季度盈利空间望改善财联社(青岛,记者肖良华)讯,原材料大幅上涨,叠加高昂的海运价格紧张的运力,轮胎行业上市公司2021年第三季度的成绩难尽人意。到四季度,随着供需面的改善,并在一波波涨价潮后,轮胎行财联社11月3日早报(周三)宏观新闻1李克强考察市场监管总局并主持召开发展壮大市场主体工作座谈会时指出,当前经济面临新的下行压力,要针对市场主体制定新的组合式减税降费政策。要健全市场监管长效机制,打击囤积居奇丰田又亮王牌,218马力油耗4。1L,更是标配10气囊提到丰田,给人印象最为深刻的品牌形象是什么?相信很多朋友和笔者一样,都是想到的耐造二字!在汽车这个行业里,丰田通过极高的造车工艺以及丰富的技术积累,给自己塑造了一个开不坏的丰田象形丰田又推SUV,配1。5L自吸,入华售价10万能成爆款吗丰田作为全球最为畅销的汽车品牌,对于任何人来说都不会对这个品牌感到陌生,旗下的车型实用耐造省油等等诸多品牌基因,让很多人选择家用车时的首选品牌。当然就价格而言,丰田也是一直比较坚挺想爆单先得会选品!5G优选这些功能助供应商选出好产品让利消费者迈进2021年的第四季度,年底大促氛围也越来越浓厚了。但可千万别认为大促就等于轻松大卖,虽然各种促销节日众多,带来丰富机会的同时,对于供应商而言,也需要注重选品策略,尤其是针对现如靠性侵视频走红全球,搞一夫多妻,新西兰这个奇葩今天火了没错,这是一张性侵。gif性侵实施者是新西兰动物界奇葩kkp鸮(xio)鹦鹉,人称鸟中哈士奇就是它!就在今天,新西兰一场大选落下帷幕。这场称为2020年度鸟儿(BirdoftheY豆瓣9。1,24岁混血美人惊艳全球直男。拥有寡姐的身材有的人生下来就不属于主流。安雅和贝丝在别人的价值观下像个异类。她们放弃了合群的机会,在找到属于自己的那条路后,各自活成了世界的女王。不合群的人生Loneliness庄严的礼堂,宾客全球化肥抢夺战加剧?俄拟对化肥出口实行配额管理财联社(上海,编辑周玲)讯,由于天然气价格飙升推升生产成本,导致部分化肥生产商不得不减产,全球化肥供应也逐渐趋于紧张。为了保障国内供应,俄罗斯总理米舒斯京(MikhailMishu五菱变年轻了全新SUV外观帅气内饰高级上市后该卖多少钱?对于上汽通用五菱,很多人都不陌生,它曾改旗下的生产线为口罩生产线,是最早转产口罩的车企之一,也打造了宏光MINIEV五菱宏光五菱征途等一系列车型,并凭借它们在市场中收获了高销量。而别克GL8可以先放下,五菱征程重新定义商务车,可家用商务拉货很多人都考虑买别克GL8来商用,但是别克GL8的定价比较高了,它更适合哪些已经在市场中站稳脚跟的企业老板去选择,而不适合正在创业或是准备创业的创业者们。所以对于这些创业者来说,别克