• 指针和引用(1)指针及其应用


    注:读《程序员面试笔记》笔记总结

    1.知识点

    (1)指针是存放内存地址的变量。

    (2)指针定义的一般形式:

    1 int a=100;
    2 int *p=&a;//指针变量p的类型是:int *

    (3)取地址操作符:&(定义时的&仅表示该变量是引用,而不是取地址);解引用操作符*(定义指针时的*仅6代表该变量是指针,而非解引用);以上二者是相反的过程。

    (4)当需要在被调函数中直接修改主调函数中的变量是,可以将主调函数中变量的地址作为参数,并在被调函数中使用解引用直接修改指针指向的变量。

    2.面试题

    2.1被调函数中修改主调函数的变量

    编写一个sort函数,将主函数中的变量重新赋值,赋值后a>=b>=c,并在主函数中补充函数调用语句

    1 int main(int argc, char *argv[]) {
    2     int a = 80, b = 60, c = 90;
    3     /*    input a line to make a>=b>=c;*/
    4     sort(&a, &b, &c);
    5     cout << a << " " << b << " " << c << endl;
    6     getchar();
    7     return 0;
    8 }

    答案:

     1 void my_swap(int *a, int *b) {    //指针作为参数,用解引用来表示变量值
     2     int tem = *a;
     3     *a = *b;
     4     *b = tem;
     5 }
     6 
     7 void sort(int *pa, int *pb, int *pc) {    //指针作为参数,用解引用来表示变量值
     8     if (*pa < *pb)    my_swap(pa, pb);
     9     if (*pa < *pc)    my_swap(pa, pc);
    10     if (*pb < *pc)    my_swap(pb, pc);
    11 }

    2.2区分指针和数组

    知识点:(1)数组名等价于数组首元素的地址(例字符串的首元素);

    (2)数组存储在栈上,不同数组之前无任何关系;

    (3)字符串常量存储在字符串常量区,相同的字符串只有一份拷贝;

    (4)当数组名作为参数时,相当于传递了数组的首元素的地址,而且只要实参是地址,那么形参一定是指针(见下面第二个代码段)。

    答案解析见代码

     1 void equal(char str7[], char str8[]) {
     2     printf("%d
    ", str7 == str8);
     3 }
     4 int main(int argc, char *argv[]) {
     5     char str1[15] = "hello,world";
     6     char str2[15] = "hello,world";
     7     char str3[] = "hello,world";
     8     char str4[] = "hello,world";
     9 
    10     char *str5 = "hello,world";
    11     char *str6 = "hello,world";
    12         
    13         //数组存储在栈上,str1和str3属于不同的数组变量,在内存中没有任何交集,故结果为0;
    14     printf("%d
    ", str1 == str2);
    15         //虽然str3,str4没有显式声明数组的大小,其大小根据初值决定,此外其他分析同上,故其结果为0;
    16     printf("%d
    ", str3 == str4);
    17         //字符串常量存储在字符串常量去中,内容相同的字符串常量只有一份拷贝,故str5,str6同时指向字符串常量的首字母,故str5==str6,结果为1;
    18     printf("%d
    ", str5 == str6);
    19         //函数的结果取决于输入的参数值是否相等,由于str1!=str2,故结果为0,若参数是str5,str6,则其结果为1
    20     equal(str1, str2);
    21     getchar();
    22     return 0;
    23 }                    

    以下代码段说明上面的知识点四

    1 //以下四种函数声明方式等价,都表示形参是指针
    2 void equal(char *str7,char *str8);
    3 void equal(char str7[1],char str8[1]);
    4 void equal(char *str7[15],char *str8[15])
    5 void equal(char *str7[100],char *str8[100])

    2.3简述指针和句柄的区别

    答案:在概念上,句柄记录着资源对象列表中某个成员的索引,起作用类似于指向指针的指针,虽然句柄本质上是一个指针,但是指针可以随意指向一个对象,而句柄只能间接指向资源对象;在使用上,通过指针可以直接修改指针指向的内容,通过句柄只能调用一些Windows提供的API函数,这种对句柄的限制主要是出于安全考虑,防止用户随意修改系统资源,从而导致一场情况发生。

  • 相关阅读:
    Spring Boot全日志设置
    SpringBoot整合Quartz
    Kubernetes网络方案的三大类别和六个场景
    微服务化之缓存的设计
    金融创新业务基于容器云的微服务化实践
    致传统企业朋友:不够痛就别微服务,有坑 (1)
    致传统企业朋友:不够痛就别微服务,有坑 (2)
    The Beam Model:Stream & Tables翻译(上)
    细说Mammut大数据系统测试环境Docker迁移之路
    [译] 关于 SPA,你需要掌握的 4 层 (1)
  • 原文地址:https://www.cnblogs.com/ys99/p/9164814.html
Copyright © 2020-2023  润新知