• 【学习日志】2022.09.18 Bikablo 指针 -> 雷火


    Bikablo

    a18d90f5623b43deb537e8f77f85c544.png

    69291fa5047e407f989edeaac42362ed.jpeg

    e76b93c3bac84eb39e0790fa27e78347.png

     15d6bf9acade48f3bfd4beeabb63a3ae.png

     

    82a3232e3e6847af9063946cdff8278b.png

    3dfe4358841e448eba2a0323e78397c8.png

     a542d268b8514831be0ed00e127ac278.png

     

    指针和引用

    C++中指针和应用的不同混用方式往往具有截然不同的语义,所以这里详细地对几种指针和引用的混用方式进行区分,指针和引用的混用常见的如下面几种:

    1. int i;
    2. int *a = &i; //这里a是一个指针,它指向变量i
    3. int &b = i; //这里b是一个引用,它是变量i的引用(别名)
    4. int * &c = a; //这里c是一个引用,它是指针a的引用
    5. int & *d; //这里d是一个指针,它指向引用,但引用不是实体,所以这是错误的

    区分技巧:在分析上面代码时,可以从变量标识符开始从右往左看,最靠近标识符的是变量的本质类型,而再往左即为对变量类型的进一步修饰。

    举例 :

    int * & a;

    标识符a的左边紧邻的是&,证明a是一个引用变量,而再往左是*,可见a是一个指针的引用,再往左是int,可见a是一个指向int类型的指针的引用。
     


     ->

    ->叫做结构体指针运算符,也是用来访问结构体内部成员的。换种说法,如果我们在C语言中定义了一个结构体,然后声明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”.
    举个例子:

    1. struct Data
    2. {
    3. int a,b,c;
    4. }; /*定义结构体类型*/
    5. struct Data * p; /* 定义结构体指针 */
    6. struct Data A = {1,2,3}; / * 声明结构体变量A,A即结构体名 */
    7. int x; /* 声明一个变量x */
    8. p = &A ; /* 地址赋值,让p指向A */
    9. x = p->a; /* 取出p所指向的结构体中包含的数据项a赋值给x */
    10. /* 此时由于p指向A,因而 p->a == A.a,也就是1 */

    因为此处p 是一个指针,所以不能使用.号访问内部成员(即不能p.a),而要使用->。但是A.a是可以的,因为A不是指针,是结构体名。

    一般情况下用“.”只需要声明一个结构体。格式是:结构体类型名+结构体名。然后用结构体名加“.”加成员名就可以引用成员了。因为自动分配了结构体的内存。如同 int a;一样。

    用“->”,则要声明一个结构体指针,还要手动开辟一个该结构体的内存(上面的代码则是建了一个结构体实例,自动分配了内存,下面的例子则会讲到手动动态开辟内存),然后把返回的地址赋给声明的结构体指针,才能用“->”正确引用。否则内存中只分配了指针的内存,没有分配结构体的内存,导致想要的结构体实际上是不存在。这时候用“->”引用自然出错了,因为没有结构体,自然没有结构体的域了。

    此外,(*p).a 等价于 p->a。

    而对于 p = p->next;这应该出现在C语言的链表,其中的next应该是自定义的一个与p同类型的结构体指针,定义格式为:

    1. struct Data
    2. {
    3. int a;
    4. struct Data * next;
    5. };/*定义结构体*/
    6. …………
    7. main()
    8. {
    9. struct Data * p;/*声明指针变量p*/
    10. ……
    11. p = p->next;/*将next中的值赋给p*/
    12. }
    1. #include
    2. #include
    3. //这里创建一个结构体用来表示链表的结点类型
    4. struct node
    5. {
    6. int data;
    7. struct node *next;
    8. };
    9. int main()
    10. {
    11. struct node *head,*p,*q,*t;
    12. int i,n,a;
    13. scanf("%d",&n);
    14. head = NULL;//头指针初始为空
    15. for(i=1;i<=n;i++)//循环读入n个数
    16. {
    17. scanf("%d",&a);
    18. //动态申请一个内存空间,用来存放一个结点,并用临时指针p指向这个结点
    19. p=(struct node *)malloc(sizeof(struct node));
    20. p->data=a;//将数据存储到当前结点的data域中
    21. p->next=NULL;//设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空
    22. if(head==NULL)
    23. head=p;//如果这是第一个创建的结点,则将头指针指向这个结点
    24. else
    25. q->next=p;//如果不是第一个创建的结点,则将上一个结点的后继指针指向当前结点
    26. q=p;//指针q也指向当前结点
    27. }
    28. //输出链表中的所有数
    29. t=head;
    30. while(t!=NULL)
    31. {
    32. printf("%d ",t->data);
    33. t=t->next;//继续下一个结点
    34. }
    35. getchar();getchar();
    36. return 0;
    37. }

    网易雷火 游戏客户端 笔试题

    d0795f27230a426fbe8c2e97a535ad5c.png

    802f073eccf34a4cacd6da09330d0219.png

     

    2a191260e0244fa0baf486b6187f564b.png

     fa98e0060a0a401cafc252814030f9ba.png

     9d658b5baca74045a115e95e2c29a7d8.png

    87e263218f444787aeead423275349c4.png

    b33489ed76614cf8b5294cc8bf79869b.png 016c1574a56844bb9267f77ae8e004c0.png

    0d428553dc234cac905864a6dd08aa76.png d94cc6fbef3440858e17d57cedfadb35.png

    3f3da56083e14259881d4f85d92f67a0.png 

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    [Qualcomm][Voice Call]语音通话流程和问题分析
    基于音频指纹的听歌识曲系统
    Java内存马学习--Filter内存马——前置概念
    CRPR (clock reconvergence pessimism removal)
    手撕Vue-数据驱动界面改变下
    使用VNA(Vector Network Analyzer)对S参数进行去嵌(一)
    将电脑文件备份到百度网盘,并实现自动备份
    【Vue】v-if和v-show的区别
    如何在idea里git提交代码时,能有emoji表情图片?emoji表情大全给大家奉上
    关于Spring遇到的各种问题
  • 原文地址:https://blog.csdn.net/Angelloveyatou/article/details/126889868