精华内容
下载资源
问答
  • 修饰变量,说明该变量不可以被改变; 修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer); 修饰引用,指向常量的引用(reference to const),用于形参类型,即避免...

    C语言面试题

    const作用
    修饰变量,说明该变量不可以被改变;

    修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer);

    修饰引用,指向常量的引用(reference to const),用于形参类型,即避免了拷贝,又避免了函数对值的修改;

    修饰成员函数,说明该成员函数内不能修改成员变量。

    const 的指针与引用

    指针
    指向常量的指针(pointer to const)
    自身是常量的指针(常量指针,const pointer)

    引用
    指向常量的引用(reference to const)

    没有 const reference,因为引用本身就是 const pointer
    (为了方便记忆可以想成)被 const 修饰(在 const 后面)的值不可改变,如下文使用例子中的 p2、p3。

    gets()函数

    问:请找出下面代码里的问题:

    #include<stdio.h> 
    int main(void) 
    { 
        char buff[10]; 
        memset(buff,0,sizeof(buff)); 
     
        gets(buff); 
     
        printf("\n The buffer entered is [%s]\n",buff); 
     
        return 0; 
    }
    

    答:上面代码里的问题在于函数gets()的使用,这个函数从stdin接收一个字符串而不检查它所复制的缓存的容积,这可能会导致缓存溢出。这里推荐使用标准函数fgets()代替。

    strcpy()函数
    问:下面是一个简单的密码保护功能,你能在不知道密码的情况下将其破解吗?

    #include<stdio.h> 
    
    int main(int argc, char *argv[]) 
    { 
        int flag = 0; 
        char passwd[10]; 
    
        memset(passwd,0,sizeof(passwd)); 
    
        strcpy(passwd, argv[1]); 
    
        if(0 == strcmp("LinuxGeek", passwd)) 
        { 
            flag = 1; 
        } 
    
        if(flag) 
        { 
            printf("\n Password cracked \n"); 
        } 
        else 
        { 
            printf("\n Incorrect passwd \n"); 
    
        } 
        return 0; 
    }
    

    答:破解上述加密的关键在于利用攻破strcpy()函数的漏洞。所以用户在向“passwd”缓存输入随机密码的时候并没有提前检查“passwd”的容量是否足够。所以,如果用户输入一个足够造成缓存溢出并且重写“flag”变量默认值所存在位置的内存的长“密码”,即使这个密码无法通过验证,flag验证位也变成了非零,也就可以获得被保护的数据了。例如:

    $ ./psswd aaaaaaaaaaaaa 
    

    Password cracked
    虽然上面的密码并不正确,但我们仍然可以通过缓存溢出绕开密码安全保护。
    要避免这样的问题,建议使用 strncpy()函数。
    作者注:最近的编译器会在内部检测栈溢出的可能,所以这样往栈里存储变量很难出现栈溢出。在我的gcc里默认就是这样,所以我不得不使用编译命令‘-fno-stack-protector’来实现上述方案。

    计算Fibonacci数列

    Fibonacci数列又称斐波那契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21。

    C语言实现的代码如下:

    /* Displaying Fibonacci sequence up to nth term where n is entered by user. */
    #include <stdio.h>
    int main()
    {
      int count, n, t1=0, t2=1, display=0;
      printf("Enter number of terms: ");
      scanf("%d",&n);
      printf("Fibonacci Series: %d+%d+", t1, t2); /* Displaying first two terms */
      count=2;    /* count=2 because first two terms are already displayed. */
      while (count<n)  
      {
          display=t1+t2;
          t1=t2;
          t2=display;
          ++count;
          printf("%d+",display);
      }
      return 0;
    }
    

    结果输出:

    Enter number of terms: 10
    Fibonacci Series: 0+1+1+2+3+5+8+13+21+34+
    

    也可以使用下面的源代码:

    /* Displaying Fibonacci series up to certain number entered by user. */
     
    #include <stdio.h>
    int main()
    {
      int t1=0, t2=1, display=0, num;
      printf("Enter an integer: ");
      scanf("%d",&num);
      printf("Fibonacci Series: %d+%d+", t1, t2); /* Displaying first two terms */
      display=t1+t2;
      while(display<num)
      {
          printf("%d+",display);
          t1=t2;
          t2=display;
          display=t1+t2;
      }
      return 0;
    }
    

    结果输出:

    Enter an integer: 200
    Fibonacci Series: 0+1+1+2+3+5+8+13+21+34+55+89+144+
    
    展开全文
  • 你认为我说java传引用对吗?  首先在Java中存在引用传递,以值传递的具体可以看一下面这个例子。    运行结果    1.首先运行mian方法入栈,给x,y变量分配地址,接下来执行operator方法,此时...

      你认为我说java是传引用对吗?

      首先在Java中不存在引用传递,是以值传递的具体可以看一下面这个例子。

      

      运行结果

      

      1.首先运行mian方法入栈,给x,y变量分配地址,接下来执行operator方法,此时operator放入栈,其分配地址给形参x,y;当运行operator的时候且传入x,y此时形参x,y的分别指向了内存中值为x和值为y的地址(常量池中的)。

      2. 在operator中操作的x,y是形参的而不是main方法中的,可以理解成就近原则吧。当运行x=x+y;的时候会将x和y拼接起来,此时x的地址不在指向之前常量池中的x地址了,而是指向一个新的地址xy。此时输入的时候自然就是xy咯。

      3.运行y=x;就是将operator的形参x执行的地址赋给了y,所以此时y输出来的值就是xy.

      4.运行完operator方法就将其弹出栈。(这和栈的数据结构设计有关)所有的给operator方法分配的空间也就消失了。

      5.运行输出语句发现x和y没有发生改变。这是因为在operator方法中的操作始终是在对自己的形参在操作。

      所以可以理解成Java是值传递(地址值),而不是引用传递。

     

    转载于:https://www.cnblogs.com/mohehpc/p/6946356.html

    展开全文
  • 中,如果关心a[]的哪一个分量会被写入,这段代码就没有问题,i也的确会增加1,对吗? 67 3.11 人们总是说i=i++的行为未定义的。可我刚刚在一个ANSI编译器上尝试过,其结果正如我所期望的。 67 3.12 我想学习...
  • 中,如果关心a[]的哪一个分量会被写入,这段代码就没有问题,i也的确会增加1,对吗?  3.11 人们总是说i=i++的行为未定义的。可我刚刚在一个ANSI编译器上尝试过,其结果正如我所期望的。  3.12 我想学习...
  • 中,如果关心a[]的哪一个分量会被写入,这段代码就没有问题,i也的确会增加1,对吗? 3.11 人们总是说i=i++的行为未定义的。可我刚刚在一个ANSI编译器上尝试过,其结果正如我所期望的。 3.12 我想学习那些...
  • 中,如果关心a[]的哪一个分量会被写入,这段代码就没有问题,i也的确会增加1,对吗? 3.11 人们总是说i=i++的行为未定义的。可我刚刚在一个ANSI编译器上尝试过,其结果正如我所期望的。 3.12 我想学习那些...
  • 中,如果关心a[]的哪一个分量会被写入,这段代码就没有问题,i也的确会增加1,对吗? 38  3.11 人们总是说i=i++的行为未定义的。可我刚刚在一个ANSI编译器上尝试过,其结果正如我所期望的。 38  3.12 我...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    中,如果关心a[]的哪一个分量会被写入,这段代码就没有问题,i也的确会增加1,对吗? 38  3.11 人们总是说i=i++的行为未定义的。可我刚刚在一个ANSI编译器上尝试过,其结果正如我所期望的。 38  3.12 我...
  • 中,如果关心a[]的哪一个分量会被写入,这段代码就没有问题,i也的确会增加1,对吗? 3.11 人们总是说i=i++的行为未定义的。可我刚刚在一个ANSI编译器上尝试过,其结果正如我所期望的。 3.12 我想学习那些复杂...
  • 中,如果关心a[]的哪一个分量会被写入,这段代码就没有问题,i也的确会增加1,对吗? 3.11 人们总是说i=i++的行为未定义的。可我刚刚在一个ANSI编译器上尝试过,其结果正如我所期望的。 3.12 我想学习那些复杂...
  • 征服指针(C)

    2018-01-20 13:00:44
    可以使用到什么程度? 139 3.4.3 typedef 141 3.5 其他 143 3.5.1 函数的形参的声明 143 3.5.2 关于空的下标运算符[] 146 3.5.3 字符串常量 148 3.5.4 关于指向函数的指针引起的混乱 151 3.5.5 强制类型转换...
  • 我们知道 a[] 的哪一个分量会被改写,但 i 的确会增加 1, 对吗? o 4.9 ++i 和 i++ 有什么区别? o 4.10 如果我使用表达式的值, 我应该用 ++i 或 i++ 来自增一个变量吗? o 4.11 为什么如下的代码 int a = ...
  • C++程序员面试宝典

    热门讨论 2013-04-01 13:36:19
    许多开发者C/C++语言及其底层原理掌握牢固,在面试过程中经常漏洞百出,无法取得好成绩。而招聘单位为了得到高素质的员工往往采用各种形式的面试考察求职者,这让面试难度大大增加。求职者要想成功应聘,不仅...
  • 你必须知道的495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    老资源。 目录 1 声明和初始化1 ...NULL 可以确保0, 但空(null) 指针却一定? . . 24 5.11 为什么有那么多关于空指针的疑惑?为什么这些问题如此经常地 出现? . . . . . . . . . . . . . . . . . . . ...
  • c++ 面试题 总结

    2009-09-16 08:44:40
    如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。 (1)const char *p 一个指向char类型的const对象指针,p不是常量,我们可以修改p的值,使其指向不同的char,但是能改变它指向非char对象,如...
  • 从一般意义上讲,对象是现实世界中一个实际存在的事物,它可以是有形的,也可以是无形的。对象是构成世界的一个独立单位,它具有自己的静态特征和动态特征。面向对象方法中的对象,是系统中用来描述客观事物的一个...
  • 4.2.6 常量指针和指向常量的指针 155 4.2.7 指针和数组 157 4.3 动态内存分配 163 4.3.1 堆的别名—— 自由存储器 164 4.3.2 new和delete运算符 164 4.3.3 为数组动态分配内存 165 4.3.4 多维数组的动态分配 ...
  • Visual C++ 2008入门经典--详细书签版

    热门讨论 2013-02-02 16:07:15
    4.2.6 常量指针和指向常量的指针 155 4.2.7 指针和数组 157 4.3 动态内存分配 163 4.3.1 堆的别名—— 自由存储器 164 4.3.2 new和delete运算符 164 4.3.3 为数组动态分配内存 165 4.3.4 多维数组的动态分配 ...

空空如也

空空如也

1 2
收藏数 21
精华内容 8
关键字:

形参不可以是常量对吗