zoukankan      html  css  js  c++  java
  • c语言面试问题

    1:
    int a[10];
    int *p=a+1;//p将指向a[1]
    p=&a+1;//p将指向a+10;
    这是因为虽然a和&a的值都一样,是a[10]的首地址,但是&a类型为int (*)[5];而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同
    a
    是长度为10int数组指针,所以要加 10*sizeof(int)

    2: 引用与指针有什么区别?
    1)
    引用必须被初始化,指针不必。
    2)
    引用初始化以后不能被改变,指针可以改变所指的对象。
    2)
    不存在指向空值的引用,但是存在指向空值的指针。

    3:五大内存分区

    C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

    栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。

    堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

    自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

    全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

    常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)

    明确区分堆与栈

    bbs上,堆与栈的区分问题,似乎是一个永恒的话题,由此可见,初学者对此往往是混淆不清的,所以我决定拿他第一个开刀。

    首先,我们举一个例子:

    void f() { int* p=new int[5]; }

    这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中
    4:char a[]="abc';
    char b[]={'a','b','c'}
    求strlen(a)和strlen(b)

    5:进程和线程的差别。
    线程是指进程内的一个执行单元,也是进程内的可调度实体.
    6与进程的区别:
    (1)
    调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
    (2)
    并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
    (3)
    拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
    (4)
    系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
    6:Heapstack的差别。
    Heap
    是堆,stack是栈。
    Stack
    的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。
    Stack
    空间有限,Heap是很大的自由存储区
    C
    中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。
    程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行
    7:以下代码中的两个sizeof用法有问题吗?[C]
    void UpperCase( char str[] ) //
    str 中的小写字母转换成大写字母
    {
    for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )
    if( 'a'<=str[i] && str[i]<='z' )
    str[i] -= ('a'-'A' );
    }
    char str[] = "aBcDe";
    cout << "str
    字符长度为: " << sizeof(str)/sizeof(str[0]) << endl;
    UpperCase( str );
    cout << str << endl;

    答:函数内的sizeof有问题。根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str是一个静态定义的数组,因此其大小为6,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此返回4
    8:进程之间通信的途径
    共享存储系统
    消息传递系统
    管道:以文件系统为基础
    9:死锁的4个必要条件
    互斥、请求保持、不可剥夺、环路
    10:进程之间通信的途径
    共享存储系统
    消息传递系统
    管道:以文件系统为基础

  • 相关阅读:
    如何使用SQL语句 查看存储过程的内容
    sl第一篇
    winForm连接数据库(sqlserver2005)
    Format
    dual使用
    ThreadLocal与事务
    oracle中的常用函数
    Oracle中merge into的使用
    API设计中token的思路
    SVN常用功能
  • 原文地址:https://www.cnblogs.com/hbt19860104/p/1205949.html
Copyright © 2011-2022 走看看