??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲欧美久久久久9999,青青青国产精品国产精品久久久久,久久人人妻人人爽人人爽http://www.shnenglu.com/hyjune/articles/53731.htmlmartin0501martin0501Tue, 17 Jun 2008 09:32:00 GMThttp://www.shnenglu.com/hyjune/articles/53731.htmlhttp://www.shnenglu.com/hyjune/comments/53731.htmlhttp://www.shnenglu.com/hyjune/articles/53731.html#Feedback0http://www.shnenglu.com/hyjune/comments/commentRss/53731.htmlhttp://www.shnenglu.com/hyjune/services/trackbacks/53731.htmlhttp://hi.baidu.com/liutingrex/blog/item/bf206e099a368eaa2eddd4b1.html

1、要把c语言的基打实

2、理解cQ+语言中一些概念以及它们之间的区别Q需要深ȝ解)Q?/p>

       Q?Q局部变?全局变量 静态变?const帔R 寄存器变?宏定义的帔R static变量

                  注:包括它们的内存分配区域,作用域,初始化等{?/p>

       Q?Q理解malloc与new之间的区别,以及free与delete之间区别

       Q?Q内联函C宏定义的区别Q它们各有什么优?/p>

       Q?Q内存分配有哪几UŞ式?分别ZQ区别是什么?对编译速度影响是何Q?/p>

       Q?Q理解什么是重蝲、覆盖、隐藏,区别是何Q可否D例?

       Q?Q什么是多态?举个例子试试

       Q?Qstruct 和class有什么区别?c语言中的struct 和cQ+中的struct一样么Q有什么区别?

       Q?Q说说什么是野指针?野指针什么情况下出现Q(没有初始化,delete后没有赋gؓNULLQ?/p>

       Q?Q你熟悉预编译指令么Q条件编译是用来做什么的Q你会写么?

       Q?QsizeofQ)q个函数你理解么Q你能说出各U变量类型在win 32 下的gQ?/p>

       Q?0Q关于stringq个cM理解么?会写它的构造函敎ͼ析构函数Q拷贝构造函敎ͼ赋值函CQ会写strcpy吗?

        Q?1Q知道断aASSERTQ)怎么样么Q一定要常用。它是函数还是宏Qؓ什么不能是函数Q?/p>

        Q?2Q懂什么是链表么?会链表的一些基本操作么Q?/p>

        Q?3Q明白队列,双链表,循环链表Q栈是怎么回事Q会写这些类?/p>

        Q?4Q一定要知道二叉树的遍历有几U,一定要会写用递归的方式来遍历它们?/p>

        Q?5Q在一个字W串中,你能计算里边“数字字符”的个CQ?/p>

        Q?6Q知道sizeof(Type*)=4吗?注:win32?/p>

        Q?7Qint array[5]= {}; sizeof(array)=?

                    int Fuction(int a[])

                     {

                         return sizeof(a);

                       }

                      Fuction(array)=?

         Q?8Q你知道函数不能q回栈指针么Q?/p>

          Q?9Q知道局部变量ؓ什么比全局变量快么Q?/p>

          Q?0Q知道ؓ什么要Zؓ写拷贝构造函CQ?/p>

×××××××××××××××××××××××××××××××××××××××××××××××××××

?1条开始属于难?/p>

           Q?1Q会用c语言实现重蝲与承么Q?/p>

            Q?2Q能说出几种排序ҎQ它们的区别和各自的优点是什么?知道什么是内排序什么是外排序么Q?/p>

            Q?3Q知道什么是struct中的寚w么?

           Q?4Qextern c‘ 是干什么的Q?/p>

            Q?5Q内存管理你懂多?Q包括内存泄漏,野指针知识,非法调用Q内存溢出等Q?/p>

            Q?6Qmallocq回什么?怎么用?

            Q?7Q待l?#8230;…

上次说了说关于c、cQ+的一些重点,现在说一些关于MFC中经常考的东西Q有些也不是专属于MFCQ但我们现在l常在MFC中用刎ͼ? ActiveX QCOMQ动态链接库的东西)Q其实在W试考试中,MFC的东西考的很少Q单位都注重c的基是否扎实Q面向对象思想是否理解的深刅R?/p>

1Q说说mfc中的cȝ承图的基本框Ӟq个题我被考过?/p>

2Q说说CViewcȝ子类都有什么?/p>

3QDLL的三U调用Ş式?/p>

4Q说说onpaintQ)和ondrawQ)的关pR?/p>

5Q说说CViewcMCDocument的关p(重要Q?/p>

6Q说SendMessageQ)与PostMessageQ)的区别?/p>

7Q简qCOM技术?/p>

8Q说说读写一个文件怎么来完成,分别用cQcQ+QMFC三种库函数来~写代码?/p>

9Q说说二q制文g和文本文件之间区别,举例子,会吗Q?/p>

10Q?net的技术优Ҏ何?





martin0501 2008-06-17 17:32 发表评论
]]>
[转] C/C++面试题六Q经典)http://www.shnenglu.com/hyjune/articles/53730.htmlmartin0501martin0501Tue, 17 Jun 2008 09:30:00 GMThttp://www.shnenglu.com/hyjune/articles/53730.htmlhttp://www.shnenglu.com/hyjune/comments/53730.htmlhttp://www.shnenglu.com/hyjune/articles/53730.html#Feedback0http://www.shnenglu.com/hyjune/comments/commentRss/53730.htmlhttp://www.shnenglu.com/hyjune/services/trackbacks/53730.htmlhttp://blog.chinaunix.net/u2/71471/showart.php?id=1002251

1.求下面函数的q回|微YQ?br>int func(x)
{
    int countx = 0;
    while(x)
    {
          countx ++;
          x = x&(x-1);
     }
    return countx;
}
假定x = 9999?{案Q?
思\Q将x转化?q制Q看含有?的个数?br>2. 什么是“引用”Q申明和使用“引用”要注意哪些问题?
{: 引用是某个目标变量?#8220;别名”(alias)Q对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完? 后,相当于目标变量名有两个名Uͼ卌目标原名U和引用名,不能再把该引用名作ؓ其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引? 名是目标变量名的一个别名,它本w不是一U数据类型,因此引用本n不占存储单元Q系l也不给引用分配存储单元。不能徏立数l的引用?br>3. ?#8220;引用”作ؓ函数参数有哪些特点?
Q?Q传递引用给函数与传递指针的效果是一L。这Ӟ被调函数的Ş参就成ؓ原来主调函数中的实参变量或对象的一个别名来使用Q所以在被调函数中对形参变量的操作就是对其相应的目标对象Q在主调函数中)的操作?br>Q?Q? 使用引用传递函数的参数Q在内存中ƈ没有产生实参的副本,它是直接对实参操作;而用一般变量传递函数的参数Q当发生函数调用Ӟ需要给形参分配存储? 元,形参变量是实参变量的副本Q如果传递的是对象,q将调用拯构造函数。因此,当参C递的数据较大Ӟ用引用比用一般变量传递参数的效率和所占空间都 好?br>Q?Q用指针作为函数的参数虽然也能辑ֈ与用引用的效果Q但是,在被调函C同样要给形参分配存储单元Q且需要重复?*指针变量? 的Ş式进行运,q很Ҏ产生错误且程序的阅读性较差;另一斚wQ在主调函数的调用点处,必须用变量的地址作ؓ实参。而引用更Ҏ使用Q更清晰?br>4. 在什么时候需要?#8220;常引?#8221;Q 
如果既要利用引用提高E序的效率,又要保护传递给函数的数据不在函C被改变,应使用常引用。常引用声明方式Qconst cd标识W?&引用?目标变量名;
?
int a ;
const int &ra=a;
ra=1; //错误
a=1; //正确
?
string foo( );
void bar(string & s);
那么下面的表辑ּ是非法的:
bar(foo( ));
bar("hello world");
原因在于foo( )?hello world"串都会生一个时对象,而在C++中,q些临时对象都是constcd的。因此上面的表达式就是试囑ְ一个constcd的对象{换ؓ非constcdQ这是非法的?br>引用型参数应该在能被定义为const的情况下Q尽量定义ؓconst ?br>5. ?#8220;引用”作ؓ函数q回值类型的格式、好处和需要遵守的规则?
格式Q类型标识符 &函数名(形参列表及类型说明){ //函数?}
好处Q在内存中不产生被返回值的副本Q(注意Q正是因点原因,所以返回一个局部变量的引用是不可取的。因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error!
注意事项Q?br>Q?Q不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用成Z"无所?的引用,E序会进入未知状态?br>Q?Q? 不能q回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题,可对于这U情况(q回函数内部new分配内存的引用)Q又面其它尬局面。例如,被函数返回的引用只是作ؓ一 个时变量出玎ͼ而没有被赋予一个实际的变量Q那么这个引用所指向的空_由new分配Q就无法释放Q造成memory leak?br>Q?Q可以返 回类成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某U业务规则(business ruleQ相兌的时候,其赋值常怸某些其它属性或者对象的状态有养I因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常 量引用(或指针)Q那么对该属性的单纯赋值就会破坏业务规则的完整性?br>Q?Q流操作W重载返回值申明ؓ“引用”的作用:
操? W?lt;<?gt;>Q这两个操作W常常希望被q箋使用Q例如:cout << "hello" << endl; 因此q两个操作符的返回值应该是一个仍然支持这两个操作W的引用。可选的其它Ҏ包括Q返回一个流对象和返回一个流对象指针。但是对于返? 一个流对象Q程序必重斎ͼ拯Q构造一个新的流对象Q也是_q箋的两?lt;<操作W实际上是针对不同对象的Q这无法让h接受。对于返回一 个流指针则不能连l?lt;<操作W。因此,q回一个流对象引用是惟一选择。这个唯一选择很关键,它说明了引用的重要性以及无可替代性,也许q? 是C++语言中引入引用这个概늚原因吧。赋值操作符=。这个操作符象流操作W一P是可以连l用的Q例如:x = j = 10;或?x=10)=100;赋值操作符的返回值必L一个左|以便可以被l赋倹{因此引用成了这个操作符的惟一q回值选择?br>?
Qi nclude <iostream.h>
int &put(int n);
int vals[10];
int error=-1;
void main()
{
put(0)=10; //以put(0)函数g为左|{h于vals[0]=10;
put(9)=20; //以put(9)函数g为左|{h于vals[9]=20;
cout<<vals[0];
cout<<vals[9];
}
int &put(int n)
{
if (n>=0 && n<=9 ) return vals[n];
else { cout<<"subscript error"; return error; }
}
Q?Q? 在另外的一些操作符中,却千万不能返回引用:+-*/ 四则q算W。它们不能返回引用,Effective C++[1]的Item23详细的讨Zq个问题。主要原因是q四个操作符没有side effectQ因此,它们必须构造一个对象作回|可选的Ҏ包括Q返回一个对象、返回一个局部变量的引用Q返回一个new分配的对象的引用、返回一 个静态对象引用。根据前面提到的引用作ؓq回值的三个规则Q第2?两个Ҏ都被否决了。静态对象的引用又因?(a+b) == (c+d))会永qؓtrue而导致错误。所以可选的只剩下返回一个对象了?br>6. “引用”与多态的关系Q?br>引用是除指针外另一个可以生多态效果的手段。这意味着Q一个基cȝ引用可以指向它的zcd例?br>?
Class A; Class B : Class A{...};  B b; A& ref = b;
7. “引用”与指针的区别是什么?
指针通过某个指针变量指向一个对象后Q对它所指向的变量间接操作。程序中使用指针Q程序的可读性差Q而引用本w就是目标变量的别名Q对引用的操作就是对目标变量的操作。此外,是上面提到的对函数传ref和pointer的区别?br>8. 什么时候需?#8220;引用”Q?br>操作符<<?gt;>、赋值操作符=的返回倹{拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用?br>以上 2-8 参考:http://blog.csdn.net/wfwd/archive/2006/05/30/763551.aspx
9. l构与联合有和区别?
1. l构和联合都是由多个不同的数据类型成员组? 但在M同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址I间Q? 而结构的所有成员都存在Q不同成员的存放地址不同Q?br> 2. 对于联合的不同成员赋? 会对其它成员重?  原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的?br>10. 下面关于“联合”的题目的输出Q?br>a)
Qi nclude <stdio.h>
union
{
int i;
char x[2];
}a;
void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
{案Q?66 (低位低地址Q高位高地址Q内存占用情冉|Ox010AQ?br>b)
     main()
     {
          union{                   /*定义一个联?/
               int i;
               struct{             /*在联合中定义一个结?/
                    char first;
                    char second;
               }half;
          }number;
          number.i=0x4241;         /*联合成员赋?/
          printf("%c%c\n", number.half.first, mumber.half.second);
          number.half.first='a';   /*联合中结构成员赋?/
          number.half.second='b';
          printf("%x\n", number.i);
          getch();
     }
{案Q?AB   (0x41对应'A',是低位;Ox42对应'B',是高位)
       6261 (number.i和number.halfq一块地址I间Q?br>11. 已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字W串QstrSrc 是源字符丌Ӏ不调用C++/C 的字W串库函敎ͼL写函?strcpy?br>{案Q?br>char *strcpy(char *strDest, const char *strSrc)
{
if ( strDest == NULL || strSrc == NULL)
return NULL ;
if ( strDest == strSrc)
return strDest ;
char *tempptr = strDest ;
while( (*strDest++ = *strSrc++) != ‘\0’)
;
return tempptr ;
}
12. 已知Stringcd义如下:
class String
{
public:
String(const char *str = NULL); // 通用构造函?br>String(const String &another); // 拯构造函?br>~ String(); // 析构函数
String & operater =(const String &rhs); // 赋值函?br>private:
char *m_data; // 用于保存字符?br>};
试写出cȝ成员函数实现?br>{案Q?br>String::String(const char *str)
{
   if ( str == NULL ) //strlen在参CؓNULL时会抛异常才会有q步判断
     {
       m_data = new char[1] ;
       m_data[0] = '\0' ;
     }
   else
    {
       m_data = new char[strlen(str) + 1];
       strcpy(m_data,str);
    }
}
String::String(const String &another)
{
    m_data = new char[strlen(another.m_data) + 1];
    strcpy(m_data,other.m_data);
}
String& String::operator =(const String &rhs)
{
    if ( this == &rhs)
        return *this ;
    delete []m_data; //删除原来的数据,新开一块内?br>    m_data = new char[strlen(rhs.m_data) + 1];
    strcpy(m_data,rhs.m_data);
    return *this ;
}
String::~String()
{
    delete []m_data ;
}
13. .h头文件中的ifndef/define/endif 的作用?
{:防止该头文g被重复引用?br>14. Qi nclude<file.h> ?Qi nclude "file.h"的区别?
{:前者是从Standard Library的\径寻扑֒引用file.hQ而后者是从当前工作\径搜dƈ引用file.h?br>15.在C++ E序中调用被C ~译器编译后的函敎ͼZ么要加extern “C”Q?br>首先Q作为extern是C/C++语言中表明函数和全局变量作用范围Q可见性)的关键字Q该关键字告诉编译器Q其声明的函数和变量可以在本模块或其它模块中使用?br>? 常,在模块的头文件中Ҏ模块提供l其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块BƲ引用该模块A中定义的全局变量和函数时? 需包含模块A的头文g卛_。这P模块B中调用模块A中的函数Ӟ在编译阶D,模块B虽然找不到该函数Q但是ƈ不会报错Q它会在q接阶段中从模块A~译? 成的目标代码中找到此函数
extern "C"是连接申?linkage declaration),被extern "C"修饰的变量和函数是按照C语言方式~译和连接的,来看看C++中对cMC的函数是怎样~译的:
作ؓ一U面向对象的语言QC++支持函数重蝲Q而过E式语言C则不支持。函数被C++~译后在W号库中的名字与C语言的不同。例如,假设某个函数的原型ؓQ?br>void foo( int x, int y );
  
该函数被C~译器编译后在符号库中的名字为_fooQ而C++~译器则会生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机Ӟ生成的新名字UCؓ“mangled name”Q?br>_foo_int_int q样的名字包含了函数名、函数参数数量及cd信息QC++是靠这U机制来实现函数重蝲的。例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )~译生成的符h不相同的Q后者ؓ_foo_int_float?br>同样 圎ͼC++中的变量除支持局部变量外Q还支持cL员变量和全局变量。用h~写E序的类成员变量可能与全局变量同名Q我们以"."来区分。而本质上Q编? 器在q行~译Ӟ与函数的处理怼Q也为类中的变量取了一个独一无二的名字,q个名字与用L序中同名的全局变量名字不同?br>未加extern "C"声明时的q接方式
假设在C++中,模块A的头文g如下Q?br>// 模块A头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
int foo( int x, int y );
#endif  
在模块B中引用该函数Q?br>// 模块B实现文g moduleB.cpp
Qi nclude "moduleA.h"
foo(2,3);
  
实际上,在连接阶D,q接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_intq样的符P
加extern "C"声明后的~译和连接方?br>加extern "C"声明后,模块A的头文g变ؓQ?br>// 模块A头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
extern "C" int foo( int x, int y );
#endif  
在模块B的实现文件中仍然调用foo( 2,3 )Q其l果是:
Q?Q模块A~译生成foo的目标代码时Q没有对其名字进行特D处理,采用了C语言的方式;
Q?Q连接器在ؓ模块B的目标代码寻找foo(2,3)调用ӞL的是未经修改的符号名_foo?br>如果在模块A中函数声明了foo为extern "C"cdQ而模块B中包含的是extern int foo( int x, int y ) Q则模块B找不到模块A中的函数Q反之亦然?br>所 以,可以用一句话概括extern “C”q个声明的真实目的(M语言中的M语法Ҏ的诞生都不是随意而ؓ的,来源于真实世界的需求驱动。我们在思考问题时Q不能只停留在这个语a是怎么 做的Q还要问一问它Z么要q么做,动机是什么,q样我们可以更深入地理解许多问题Q:实现C++与C及其它语a的؜合编E。  
明白了C++中extern "C"的设立动机,我们下面来具体分析extern "C"通常的用技巧:
extern "C"的惯用法
Q?Q在C++中引用C语言中的函数和变量,在包含C语言头文Ӟ假设为cExample.hQ时Q需q行下列处理Q?br>extern "C"
{
Qi nclude "cExample.h"
}
而在C语言的头文g中,对其外部函数只能指定为externcdQC语言中不支持extern "C"声明Q在.c文g中包含了extern "C"时会出现~译语法错误?br>C++引用C函数例子工程中包含的三个文g的源代码如下Q?br>/* c语言头文ӞcExample.h */
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
extern int add(int x,int y);
#endif
/* c语言实现文gQcExample.c */
Qi nclude "cExample.h"
int add( int x, int y )
{
return x + y;
}
// c++实现文gQ调用addQcppFile.cpp
extern "C"
{
Qi nclude "cExample.h"
}
int main(int argc, char* argv[])
{
add(2,3);
return 0;
}
如果C++调用一个C语言~写?DLLӞ当包?DLL的头文g或声明接口函数时Q应加extern "C" { }?br>Q?Q在C中引用C++语言中的函数和变量时QC++的头文g需dextern "C"Q但是在C语言中不能直接引用声明了extern "C"的该头文Ӟ应该仅将C文g中将C++中定义的extern "C"函数声明为externcd?br>C引用C++函数例子工程中包含的三个文g的源代码如下Q?br>//C++头文?cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x, int y );
#endif
//C++实现文g cppExample.cpp
Qi nclude "cppExample.h"
int add( int x, int y )
{
return x + y;
}
/* C实现文g cFile.c
/* q样会编译出错:Qi nclude "cExample.h" */
extern int add( int x, int y );
int main( int argc, char* argv[] )
{
add( 2, 3 );
return 0;
}
15题目的解{请参考《C++中extern “C”含义深层探烦》注解:
16. 兌、聚?Aggregation)以及l合(Composition)的区别?
涉及到UML中的一些概念:兌是表CZ个类的一般性联p,比如“学生”?#8220;老师”是一U关联关p;聚合表示has-a的关p,是一U相Ҏ散的关系Q聚合类不需要对被聚合类负责Q如下图所C,用空的菱形表C合关p:
                          
从实现的角度Ԍ聚合可以表示?
class A {...}  class B { A* a; .....}
而组合表Ccontains-a的关p,兌性强于聚合:l合cM被组合类有相同的生命周期Q组合类要对被组合类负责Q采用实心的菱Ş表示l合关系Q?br>                           
实现的Ş式是:
class A{...} class B{ A a; ...}
参考文章:http://blog.csdn.net/wfwd/archive/2006/05/30/763753.aspx
          http://blog.csdn.net/wfwd/archive/2006/05/30/763760.aspx
17.面向对象的三个基本特征,q简单叙qCQ?br>1. 装Q将客观事物抽象成类Q每个类对自w的数据和方法实行protection(private, protected,public)
2. l承Q广义的l承有三U实现Ş式:实现l承Q指使用基类的属性和Ҏ而无需额外~码的能力)、可视承(子窗体用父H体的外观和实现代码Q、接口? Q仅使用属性和ҎQ实现滞后到子类实现Q。前两种Q类l承Q和后一U(对象l合=>接口l承以及U虚函数Q构成了功能复用的两U方式?br>3. 多态:是将父对象设|成为和一个或更多的他的子对象相等的技术,赋g后,父对象就可以Ҏ当前赋值给它的子对象的Ҏ以不同的方式运作。简单的_是一句话Q允许将子类cd的指针赋值给父类cd的指针?br>18. 重蝲Qoverload)和重?overriedQ有的书也叫?#8220;覆盖”Q的区别Q?br>常考的题目。从定义上来_
重蝲Q是指允许存在多个同名函敎ͼ而这些函数的参数表不同(或许参数个数不同Q或许参数类型不同,或许两者都不同Q?br>重写Q是指子c重新定义复c虚函数的方法?br>从实现原理上来说Q?br>? 载:~译器根据函C同的参数表,对同名函数的名称做修饎ͼ然后q些同名函数成了不同的函数Q至对于编译器来说是这LQ。如Q有两个同名? 敎ͼfunction func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这LQint_func、str_func。对于这两个函数? 调用Q在~译器间已l确定了Q是静态的。也是_它们的地址在编译期q定了Q早l定Q,因此Q重载和多态无养I
重写Q和多态真正相兟뀂当子类重新定义了父cȝ虚函数后Q父cL针根据赋l它的不同的子类指针Q动态的调用属于子类的该函数Q这L函数调用在编译期间是无法定的(调用的子cȝ虚函数的地址无法l出Q。因此,q样的函数地址是在q行期绑定的Q晚l定Q?br>19. 多态的作用Q?br>主要是两个:1. 隐藏实现l节Q得代码能够模块化Q扩展代码模块,实现代码重用Q?. 接口重用Qؓ了类在承和z的时候,保证使用家族中Q一cȝ实例的某一属性时的正调用?br>20. Ado与Ado.net的相同与不同Q?br>? ?#8220;能够让应用程序处理存储于DBMS 中的数据“q一基本怼点外Q两者没有太多共同之处。但是Ado使用OLE DB 接口q基于微软的COM 技术,而ADO.NET 拥有自己的ADO.NET 接口q且Z微Y?NET 体系架构。众所周知.NET 体系不同于COM 体系QADO.NET 接口也就完全不同于ADO和OLE DB 接口Q这也就是说ADO.NET 和ADO是两U数据访问方式。ADO.net 提供对XML 的支持?br>21. New delete 与malloc free 的联pM区别?
{案Q都是在?heap)上进行动态的内存操作。用malloc函数需要指定内存分配的字节数ƈ且不能初始化对象Qnew 会自动调用对象的构造函数。delete 会调用对象的destructorQ而free 不会调用对象的destructor.
22. #define DOUBLE(x) x+x Qi = 5*DOUBLE(5)Q?i 是多?
{案Qi ?0?br>23. 有哪几种情况只能用intialization list 而不能用assignment?
{案Q当cM含有const、reference 成员变量Q基cȝ构造函数都需要初始化表?br>24. C++是不是类型安全的Q?br>{案Q不是。两个不同类型的指针之间可以强制转换Q用reinterpret cast)。C#是类型安全的?br>25. main 函数执行以前Q还会执行什么代码?
{案Q全局对象的构造函C在main 函数之前执行?br>26. 描述内存分配方式以及它们的区?
1Q从静态存储区域分配。内存在E序~译的时候就已经分配好,q块内存在程序的整个q行期间都存在。例如全局变量Qstatic 变量?br>2Q在栈上创徏。在执行函数Ӟ函数内局部变量的存储单元都可以在栈上创徏Q函数执行结束时q些存储单元自动被释放。栈内存分配q算内置于处理器的指令集?br>3Q?从堆上分配,亦称动态内存分配。程序在q行的时候用malloc 或new 甌L多少的内存,E序员自p责在何时用free 或delete 释放内存。动态内存的生存期由E序员决定,使用非常灉|Q但问题也最多? 27.struct ?class 的区?br>{案Qstruct 的成员默认是公有的,而类的成员默认是U有的。struct ?class 在其他方面是功能相当的?br>? 感情上讲Q大多数的开发者感到类和结构有很大的差别。感觉上l构仅仅象一堆缺乏封装和功能的开攄内存位,而类pzȝq且可靠的社会成员,它有? 务,有牢固的装屏障和一个良好定义的接口。既然大多数人都q么认ؓQ那么只有在你的cL很少的方法ƈ且有公有数据Q这U事情在良好设计的系l中是存? ?Q时Q你也许应该使用 struct 关键字,否则Q你应该使用 class 关键字?
28.当一个类A 中没有生命Q何成员变量与成员函数,q时sizeof(A)的值是多少Q如果不是零Q请解释一下编译器Z么没有让它ؓ零。(AutodeskQ?br>{案Q肯定不是零。D个反例,如果是零的话Q声明一个class A[10]对象数组Q而每一个对象占用的I间是零Q这时就没办法区分A[0],A[1]…了?br>29. ?086 汇编下,逻辑地址和物理地址是怎样转换的?QIntelQ?br>{案Q通用寄存器给出的地址Q是D内偏移地址Q相应段寄存器地址*10H+通用寄存器内地址Q就得到了真正要讉K的地址?br>30. 比较C++中的4U类型{换方式?
请参考:http://blog.csdn.net/wfwd/archive/2006/05/30/763785.aspxQ重Ҏstatic_cast, dynamic_cast和reinterpret_cast的区别和应用?br>31.分别写出BOOL,int,float,指针cd的变量a ?#8220;?#8221;的比较语句?br>{案Q?br>BOOL :    if ( !a ) or if(a)
int :     if ( a == 0)
float :   const EXPRESSION EXP = 0.000001
          if ( a < EXP && a >-EXP)
pointer : if ( a != NULL) or if(a == NULL)
 
32.误出const?define 相比Q有何优点?
{案Q?Q?const 帔R有数据类型,而宏帔R没有数据cd。编译器可以对前者进行类型安全检查。而对后者只q行字符替换Q没有类型安全检查,q且在字W替换可能会产生意料不到的错误?br>      2Q?有些集成化的调试工具可以对const 帔Rq行调试Q但是不能对宏常量进行调试?br>33.q数l与指针的区别?
数组要么在静态存储区被创建(如全局数组Q,要么在栈上被创徏。指针可以随时指向Q意类型的内存块?br>(1)修改内容上的差别
char a[] = “hello”;
a[0] = ‘X’;
char *p = “world”; // 注意p 指向帔R字符?br>p[0] = ‘X’; // ~译器不能发现该错误Q运行时错误
(2) 用运符sizeof 可以计算出数l的定wQ字节数Q。sizeof(p),p 为指针得到的是一个指针变量的字节敎ͼ而不是p 所指的内存定w。C++/C 语言没有办法知道指针所指的内存定wQ除非在甌内存时记住它。注意当数组作ؓ函数的参数进行传递时Q该数组自动退化ؓ同类型的指针?br>char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl; // 12 字节
cout<< sizeof(p) << endl; // 4 字节
计算数组和指针的内存定w
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4 字节而不?00 字节
}
34.cL员函数的重蝲、覆盖和隐藏区别Q?br>{案Q?br>a.成员函数被重载的特征Q?br>Q?Q相同的范围Q在同一个类中)Q?br>Q?Q函数名字相同;
Q?Q参C同;
Q?Qvirtual 关键字可有可无?br>b.覆盖是指zcd数覆盖基cd敎ͼ特征是:
Q?Q不同的范围Q分别位于派生类与基c)Q?br>Q?Q函数名字相同;
Q?Q参数相同;
Q?Q基cd数必Lvirtual 关键字?br>c.“隐藏”是指zcȝ函数屏蔽了与其同名的基类函数Q规则如下:
Q?Q如果派生类的函C基类的函数同名,但是参数不同。此Ӟ不论有无virtual关键字,基类的函数将被隐藏(注意别与重蝲hQ?br>Q?Q如果派生类的函C基类的函数同名,q且参数也相同,但是基类函数没有virtual 关键字。此Ӟ基类的函数被隐藏Q注意别与覆盖؜淆)
35. There are two int variables: a and b, don’t use “if”, “? :”, “switch”or other judgement statements, find out the biggest one of the two numbers.
{案Q? ( a + b ) + abs( a - b ) ) / 2
36. 如何打印出当前源文g的文件名以及源文件的当前行号Q?br>{案Q?br>cout << __FILE__ ;
cout<<__LINE__ ;
__FILE__和__LINE__是系l预定义宏,q种宏ƈ不是在某个文件中定义的,而是q译器定义的?br>37. main d数执行完毕后Q是否可能会再执行一D代码,l出说明Q?br>{案Q可以,可以用_onexit 注册一个函敎ͼ它会在main 之后执行int fn1(void), fn2(void), fn3(void), fn4 (void);
void main( void )
{
String str("zhanglin");
_onexit( fn1 );
_onexit( fn2 );
_onexit( fn3 );
_onexit( fn4 );
printf( "This is executed first.\n" );
}
int fn1()
{
printf( "next.\n" );
return 0;
}
int fn2()
{
printf( "executed " );
return 0;
}
int fn3()
{
printf( "is " );
return 0;
}
int fn4()
{
printf( "This " );
return 0;
}
The _onexit function is passed the address of a function (func) to be called when the program terminates normally. Successive calls to _onexit create a register of functions that are executed in LIFO (last-in-first-out) order. The functions passed to _onexit cannot take parameters.
38. 如何判断一D늨序是由C ~译E序q是由C++~译E序~译的?
{案Q?br>#ifdef __cplusplus
cout<<"c++";
#else
cout<<"c";
#endif
39.文g中有一l整敎ͼ要求排序后输出到另一个文件中
{案Q?br>Qi nclude<iostream>
Qi nclude<fstream>
using namespace std;
void Order(vector<int>& data) //bubble sort
{
int count = data.size() ;
int tag = false ; // 讄是否需要l冒泡的标志?br>for ( int i = 0 ; i < count ; i++)
{
for ( int j = 0 ; j < count - i - 1 ; j++)
{
if ( data[j] > data[j+1])
{
tag = true ;
int temp = data[j] ;
data[j] = data[j+1] ;
data[j+1] = temp ;
}
}
if ( !tag )
break ;
}
}
void main( void )
{
vector<int>data;
ifstream in("c:\\data.txt");
if ( !in)
{
cout<<"file error!";
exit(1);
}
int temp;
while (!in.eof())
{
in>>temp;
data.push_back(temp);
}
in.close(); //关闭输入文g?br>Order(data);
ofstream out("c:\\result.txt");
if ( !out)
{
cout<<"file error!";
exit(1);
}
for ( i = 0 ; i < data.size() ; i++)
out<<data<<" ";
out.close(); //关闭输出文g?br>}
 
40. 链表题:一个链表的l点l构
struct Node
{
int data ;
Node *next ;
};
typedef struct Node Node ;
(1)已知链表的头l点head,写一个函数把q个链表逆序 ( Intel)
Node * ReverseList(Node *head) //链表逆序
{
if ( head == NULL || head->next == NULL )
return head;
Node *p1 = head ;
Node *p2 = p1->next ;
Node *p3 = p2->next ;
p1->next = NULL ;
while ( p3 != NULL )
{
p2->next = p1 ;
p1 = p2 ;
p2 = p3 ;
p3 = p3->next ;
}
p2->next = p1 ;
head = p2 ;
return head ;
}
(2)已知两个链表head1 和head2 各自有序Q请把它们合q成一个链表依然有序?保留所有结点,即便大小相同Q?br>Node * Merge(Node *head1 , Node *head2)
{
if ( head1 == NULL)
return head2 ;
if ( head2 == NULL)
return head1 ;
Node *head = NULL ;
Node *p1 = NULL;
Node *p2 = NULL;
if ( head1->data < head2->data )
{
head = head1 ;
p1 = head1->next;
p2 = head2 ;
}
else
{
head = head2 ;
p2 = head2->next ;
p1 = head1 ;
}
Node *pcurrent = head ;
while ( p1 != NULL && p2 != NULL)
{
if ( p1->data <= p2->data )
{
pcurrent->next = p1 ;
pcurrent = p1 ;
p1 = p1->next ;
}
else
{
pcurrent->next = p2 ;
pcurrent = p2 ;
p2 = p2->next ;
}
}
if ( p1 != NULL )
pcurrent->next = p1 ;
if ( p2 != NULL )
pcurrent->next = p2 ;
return head ;
}
(3)已知两个链表head1 和head2 各自有序Q请把它们合q成一个链表依然有序,q次要求用递归Ҏq行?(Autodesk)
{案Q?br>Node * MergeRecursive(Node *head1 , Node *head2)
{
if ( head1 == NULL )
return head2 ;
if ( head2 == NULL)
return head1 ;
Node *head = NULL ;
if ( head1->data < head2->data )
{
head = head1 ;
head->next = MergeRecursive(head1->next,head2);
}
else
{
head = head2 ;
head->next = MergeRecursive(head1,head2->next);
}
return head ;
}
41. 分析一下这D늨序的输出 (Autodesk)
class B
{
public:
B()
{
cout<<"default constructor"<<endl;
}
~B()
{
cout<<"destructed"<<endl;
}
B(int i):data(i)    //B(int) works as a converter ( int -> instance of  B)
{
cout<<"constructed by parameter " << data <<endl;
}
private:
int data;
};
B Play( B b)
{
return b ;
}
(1)                                                    results:
int main(int argc, char* argv[])         constructed by parameter 5
{                                                       destructed  B(5)形参析构
B t1 = Play(5); B t2 = Play(t1);       destructed  t1形参析构
return 0;             destructed  t2 注意序Q?br>}                                                       destructed  t1
(2)                                                    results:
int main(int argc, char* argv[])          constructed by parameter 5
{                                                        destructed  B(5)形参析构
B t1 = Play(5); B t2 = Play(10);      constructed by parameter 10
return 0;              destructed  B(10)形参析构
}                                                        destructed  t2 注意序Q?br>                                                         destructed  t1
42. 写一个函数找Z个整数数l中Q第二大的数 QmicrosoftQ?br>{案Q?br>const int MINNUMBER = -32767 ;
int find_sec_max( int data[] , int count)
{
int maxnumber = data[0] ;
int sec_max = MINNUMBER ;
for ( int i = 1 ; i < count ; i++)
{
if ( data > maxnumber )
{
sec_max = maxnumber ;
maxnumber = data ;
}
else
{
if ( data > sec_max )
sec_max = data ;
}
}
return sec_max ;
}
43. 写一个在一个字W串(n)中寻找一个子?m)W一个位|的函数?br>KMP法效率最好,旉复杂度是Q?n+m)?br>44. 多重l承的内存分配问题:
   比如有class A : public class B, public class C {}
   那么A的内存结构大致是怎么LQ?br>q个是compiler-dependent? 不同的实现其l节可能不同?br>如果不考虑有虚函数、虚l承的话q当简单;否则的话Q相当复杂?br>可以参考《深入探索C++对象模型》,或者:
http://blog.csdn.net/wfwd/archive/2006/05/30/763797.aspx
45. 如何判断一个单链表是有环的Q(注意不能用标志位Q最多只能用两个额外指针Q?br>   struct node { char val; node* next;}
   bool check(const node* head) {} //return false : 无环Qtrue: 有环
一UOQnQ的办法是Q搞两个指针Q一个每ơ递增一步,一个每ơ递增两步Q如果有环的话两者必焉合,反之亦然Q:
bool check(const node* head)
{
    if(head==NULL)  return false;
    node *low=head, *fast=head->next;
    while(fast!=NULL && fast->next!=NULL)
    {
        low=low->next;
        fast=fast->next->next;
        if(low==fast) return true;
    }
    return false;
}



martin0501 2008-06-17 17:30 发表评论
]]>
[转] C面试ȝ(?http://www.shnenglu.com/hyjune/articles/53727.htmlmartin0501martin0501Tue, 17 Jun 2008 09:11:00 GMThttp://www.shnenglu.com/hyjune/articles/53727.htmlhttp://www.shnenglu.com/hyjune/comments/53727.htmlhttp://www.shnenglu.com/hyjune/articles/53727.html#Feedback0http://www.shnenglu.com/hyjune/comments/commentRss/53727.htmlhttp://www.shnenglu.com/hyjune/services/trackbacks/53727.htmlhttp://blog.csdn.net/fansnaf/archive/2006/11/03/1364447.aspx

本h很弱Q这几个题也搞不定,Ҏ求救Q?br>1Q读文gfile1.txt的内容(例如Q:
12
34
56
输出到file2.txtQ?br>56
34
12
Q逆序Q?br>2Q输出和Z个给定整数的所有组?br>例如n=5
5=1+4Q?=2+3Q相加的C能重复)
则输?br>1Q?Q?Q??br>望高手赐教!Q?br>
W一?注意可增长数l的应用.
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int MAX = 10;
int *a = (int *)malloc(MAX * sizeof(int));
int *b;

FILE *fp1;
FILE *fp2;

fp1 = fopen("a.txt","r");
if(fp1 == NULL)
{printf("error1");
exit(-1);
}

fp2 = fopen("b.txt","w");
if(fp2 == NULL)
{printf("error2");
exit(-1);
}

int i = 0;
int j = 0;

while(fscanf(fp1,"%d",&a[i]) != EOF)
{
i++;
j++;
if(i >= MAX)
{
MAX = 2 * MAX;
b = (int*)realloc(a,MAX * sizeof(int));
if(b == NULL)
{
printf("error3");
exit(-1);
}
a = b;
}
}

for(;--j >= 0;)
fprintf(fp2,"%d\n",a[j]);

fclose(fp1);
fclose(fp2);

return 0;


}

W二?
#include <stdio.h>

int main(void)
{
unsigned long int i,j,k;

printf("please input the number\n");
scanf("%d",&i);
if( i % 2 == 0)
j = i / 2;
else
j = i / 2 + 1;

printf("The result is \n");
for(k = 0; k < j; k++)
printf("%d = %d + %d\n",i,k,i - k);
return 0;
}

#include <stdio.h>
void main()
{
unsigned long int a,i=1;
scanf("%d",&a);
if(a%2==0)
{
for(i=1;i<a/2;i++)
printf("%d",a,a-i);
}
else
for(i=1;i<=a/2;i++)
printf(" %d, %d",i,a-i);
}

兄弟,q样的题目若是做不出来实在是有些不应? l你一个递规反向输出字符串的例子,可谓是反序的l典例程.

void inverse(char *p)
{
if( *p = = '\0' )
return;
inverse( p+1 );
printf( "%c", *p );
}

int main(int argc, char *argv[])
{
inverse("abc\0");

return 0;
}

借签了楼上的“递规反向输出”
#include <stdio.h>
void test(FILE *fread, FILE *fwrite)
{
char buf[1024] = {0};
if (!fgets(buf, sizeof(buf), fread))
return;
test( fread, fwrite );
fputs(buf, fwrite);
}
int main(int argc, char *argv[])
{
FILE *fr = NULL;
FILE *fw = NULL;
fr = fopen("data", "rb");
fw = fopen("dataout", "wb");
test(fr, fw);
fclose(fr);
fclose(fw);
return 0;
}

在对齐ؓ4的情况下
struct BBB
{
long numQ?br>char *name;
short int data;
char ha;
short ba[5];
}*p;
p=0x1000000;
p+0x200=____;
(Ulong)p+0x200=____;
(char*)p+0x200=____;
希望各位达hl出{案和原因,谢谢?br>解答Q假讑֜32位CPU上,
sizeof(long) = 4 bytes
sizeof(char *) = 4 bytes
sizeof(short int) = sizeof(short) = 2 bytes
sizeof(char) = 1 bytes

׃?字节寚wQ?br>sizeof(struct BBB) = sizeof(*p)
= 4 + 4 + 2 + 1 + 1/*补齐*/ + 2*5 + 2/*补齐*/ = 24 bytes (lDev-C++验证)

p=0x1000000;
p+0x200=____;
= 0x1000000 + 0x200*24

(Ulong)p+0x200=____;
= 0x1000000 + 0x200

(char*)p+0x200=____;
= 0x1000000 + 0x200*4

你可以参考一下指针运的l节


? 一D늨序,扑և数组中第k大小的数Q输出数所在的位置。例如{2Q?Q?Q?Q?}中,W一大的数是7Q位|在4。第二大、第三大的数都是4Q位|在1? 3随便输出哪一个均可。函数接口ؓQint find_orderk(const int* narry,const int n,const int k)
要求法复杂度不能是O(n^2Q?br>谢谢Q?br>可以先用快速排序进行排序,其中用另外一个进行地址查找
代码如下Q在VC++6.0q行通过。给分吧^-^

//快速排?br>
#include<iostream>

usingnamespacestd;

intPartition (int*L,intlow,int high)
{
inttemp = L[low];
intpt = L[low];

while (low < high)
{
while (low < high && L[high] >= pt)
--high;
L[low] = L[high];
while (low < high && L[low] <= pt)
++low;
L[low] = temp;
}
L[low] = temp;

returnlow;
}

voidQSort (int*L,intlow,int high)
{
if (low < high)
{
intpl = Partition (L,low,high);

QSort (L,low,pl - 1);
QSort (L,pl + 1,high);
}
}

intmain ()
{
intnarry[100],addr[100];
intsum = 1,t;

cout << "Input number:" << endl;
cin >> t;

while (t != -1)
{
narry[sum] = t;
addr[sum - 1] = t;
sum++;

cin >> t;
}

sum -= 1;
QSort (narry,1,sum);

for (int i = 1; i <= sum;i++)
cout << narry[i] << '\t';
cout << endl;

intk;
cout << "Please input place you want:" << endl;
cin >> k;

intaa = 1;
intkk = 0;
for (;;)
{
if (aa == k)
break;
if (narry[kk] != narry[kk + 1])
{
aa += 1;
kk++;
}

}

cout << "The NO." << k << "number is:" << narry[sum - kk] << endl;
cout << "And it's place is:" ;
for (i = 0;i < sum;i++)
{
if (addr[i] == narry[sum - kk])
cout << i << '\t';
}


return0;
}

1、找?br>Void test1()
{
char string[10];
char* str1="0123456789";
strcpy(string, str1);// 溢出Q应该包括一个存?\0'的字Wstring[11]
}


Void test2()
{
char string[10], str1[10];
for(I=0; I<10;I++)
{
str1[i] ='a';
}
strcpy(string, str1);// IQi没有声明?br>}

Void test3(char* str1)
{
char string[10];
if(strlen(str1)<=10)// Ҏ<10,字符溢出Q将strlen改ؓsizeof也可?br>{
strcpy(string, str1);
}
}

2.
void g(int**);
int main()
{
int line[10],i;
int *p=line; //p是地址的地址
for (i=0;i<10;i++)
{
*p=i;
g(&p);//数组对应的值加1
}
for(i=0;i<10;i++)
printf("%d\n",line[i]);
return 0;
}

void g(int**p)
{
(**p)++;
(*p)++;// 无效
}
输出Q?br>1
2
3
4
5
6
7
8
9
10
3. 写出E序q行l果

int sum(int a)
{
auto int c=0;
static int b=3;
c+=1;
b+=2;
return(a+b+c);
}

void main()
{
int I;
int a=2;
for(I=0;I<5;I++)
{
printf("%d,", sum(a));
}
}
// static会保存上ơ结果,Cq一点,剩下的自己写
输出Q?,10,12,14,16,


4.

int func(int a)
{
int b;
switch(a)
{
case 1: 30;
case 2: 20;
case 3: 16;
default: 0
}
return b;
}
则func(1)=?
// b定义后就没有赋倹{?br>
5:
int a[3];
a[0]=0; a[1]=1; a[2]=2;
int *p, *q;
p=a;
q=&a[2];
则a[q-p]=a[2]
解释Q指针一ơ移动一个int但计Cؓ1

今天早上的面试题9道,比较难,向牛教,国内的一牛公司,坐落在北京北四环某大厦:
1、线形表a、bZ个有序升序的UŞ表,~写一E序Q两个有序UŞ表合q成一个有序升序线形表hQ?br>{案?请化大学 严锐敏《数据结构第二版》第二章例题Q数据结构当中,q个叫做Q两路归q排?br>Linklist *unio(Linklist *p,Linklist *q){
linklist *R,*pa,*qa,*ra;
pa=p;
qa=q;
R=ra=p;
while(pa->next!=NULL&&qa->next!=NULL){
if(pa->data>qa->data){
ra->next=qa;
qa=qa->next;
}
else{
ra->next=pa;
pa=pa->next;
}
}
if(pa->next!=NULL)
ra->next=pa;
if(qa->next!=NULL)
ra->next==qa;
return R;
}
2、运用四色定理,为N个局域D行配Ԍ颜色????四种Q另有数ladj[][N]Q如adj[i][j]=1则表Ci区域与j区域盔RQ数lcolor[N]Q如color[i]=1,表示i区域的颜色ؓ1号颜艌Ӏ?br>四色填充
3、用递归法判断数组a[N]是否Z个递增数组?br>递归的方法,记录当前最大的Qƈ且判断当前的是否比这个还大,大则l箋Q否则返回falsel束Q?br>bool fun( int a[], int n )
{
if( n= =1 )
return true;
if( n= =2 )
return a[n-1] >= a[n-2];
return fun( a,n-1) && ( a[n-1] >= a[n-2] );
}
4、编写算法,?0亿个点数当中,选出其中最大的10000个?br>用外部排序,在《数据结构》书上有
《计方法导论》在扑ֈWn大的数的法上加?br>5、编写一unixE序Q防止僵进E的出现.

同学?道面试题Q应聘的职位是搜索引擎工E师Q后两道难,Q希望大家多l一些算发)
1.l两个数l和他们的大,q有一动态开辟的内存Q求交集Q把交集攑ֈ动态内存dongtaiQƈ且返回交集个?br>long jiaoji(long* a[],long b[],long* alength,long blength,long* dongtai[])
2.单连表的建立Q把'a'--'z'26个字母插入到q表中,q且倒叙Q还要打华ͼ
Ҏ1Q?br>typedef struct val
{ int date_1;
struct val *next;
}*p;

void main(void)
{ char c;

for(c=122;c>=97;c--)
{ p.date=c;
p=p->next;
}

p.next=NULL;
}
}
Ҏ2Q?br>node *p = NULL;
node *q = NULL;

node *head = (node*)malloc(sizeof(node));
head->data = ' ';head->next=NULL;

node *first = (node*)malloc(sizeof(node));
first->data = 'a';first->next=NULL;head->next = first;
p = first;

int longth = 'z' - 'b';
int i=0;
while ( i<=longth )
{
node *temp = (node*)malloc(sizeof(node));
temp->data = 'b'+i;temp->next=NULL;q=temp;

head->next = temp; temp->next=p;p=q;
i++;
}

print(head);

3.可怕的题目l于来了
象搜索的输入信息是一个字W串Q统?00万输入信息中的最热门的前十条Q我们每ơ输入的一个字W串Z过255byte,内存使用只有1G,
hq思想Q写出算发(c语言Q,I间和时间复杂度Q?br>4.国内的一些帖吧,如baidu,有几十万个主题,假设每一个主题都有上亿的跟帖子,怎么栯计这个系l速度最好,hq思想Q写出算发(c语言Q,I间和时间复杂度Q?br>

#include string.h
main(void)
{ char *src="hello,world";
char *dest=NULL;
dest=(char *)malloc(strlen(src));
int len=strlen(str);
char *d=dest;
char *s=src[len];
while(len--!=0)
d++=s--;
printf("%s",dest);
}
扑և错误Q!
#include "string.h"
#include "stdio.h"
#include "malloc.h"
main(void)
{
char *src="hello,world";
char *dest=NULL;
dest=(char *)malloc(sizeof(char)*(strlen(src)+1));
int len=strlen(src);
char *d=dest;
char *s=src+len-1;
while(len--!=0)
*d++=*s--;
*d='\0';
printf("%s",dest);
}

1. qC个Linux驱动E序的主要流E与功能?br>
2. 请列举一个Y件中旉换空间或者空间换旉的例子?br>void swap(int a,int b)
{
int c; c=a;a=b;b=a;
}
--->IZ
void swap(int a,int b)
{
a=a+b;b=a-b;a=a-b;
}
6. 请问一下程序将输出什么结果?
char *RetMenory(void)
{
char p[] = “hellow world”;
return p;
}
void Test(void)
{
char *str = NULL;
str = RetMemory();
printf(str);
}
RetMenory执行完毕Qp资源被回Ӟ指向未知地址。返回地址Qstr的内容应是不可预的, 打印的应该是str的地址


写一个函?它的原Ş是int continumax(char *outputstr,char *intputstr)
功能Q?br>在字W串中找l最长的数字Ԍq把q个串的长度q回Qƈ把这个最长数字串付给其中一个函数参数outputstr所指内存。例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数返?br>9Qoutputstr所指的gؓ123456789
int continumax(char *outputstr, char *inputstr)
{
char *in = inputstr, *out = outputstr, *temp, *final;
int count = 0, maxlen = 0;

while( *in != '\0' )
{
if( *in > 47 && *in < 58 )
{
for(temp = in; *in > 47 && *in < 58 ; in++ )
count++;
}
else
in++;

if( maxlen < count )
{
maxlen = count;
count = 0;
final = temp;
}
}
for(int i = 0; i < maxlen; i++)
{
*out = *final;
out++;
final++;
}
*out = '\0';
return maxlen;
}

不用库函?用C语言实现一整型数字转化为字W串
Ҏ1Q?br>int getlen(char *s){
int n;
for(n = 0; *s != '\0'; s++)
n++;
return n;
}
void reverse(char s[])
{
int c,i,j;
for(i = 0,j = getlen(s) - 1; i < j; i++,j--){
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
void itoa(int n,char s[])
{
int i,sign;
if((sign = n) < 0)
n = -n;
i = 0;
do{/*以反序生成数?/
s[i++] = n%10 + '0';/*get next number*/
}while((n /= 10) > 0);/*delete the number*/

if(sign < 0)
s[i++] = '-';

s[i] = '\0';
reverse(s);
}
Ҏ2:
#include <iostream>
using namespace std;

void itochar(int num);

void itochar(int num)
{
int i = 0;
int j ;
char stra[10];
char strb[10];
while ( num )
{
stra[i++]=num%10+48;
num=num/10;
}
stra[i] = '\0';
for( j=0; j < i; j++)
{
strb[j] = stra[i-j-1];
}
strb[j] = '\0';
cout<<strb<<endl;

}
int main()
{
int num;
cin>>num;
itochar(num);
return 0;
}

前几天面试,有一题想不明?h大家Q?br>typedef struct
{
int a:2;
int b:2;
int c:1;
}test;

test t;
t.a = 1;
t.b = 3;
t.c = 1;

printf("%d",t.a);
printf("%d",t.b);
printf("%d",t.c);

谢谢!
t.a?1,输出是1
t.b?1Q输出就是-1
t.c?Q输Z?1
3个都是有W号数int嘛?br>q是位扩展问?
01
11
1
~译器进行符h?br>

求组合数Q?求n个数Q?....nQ中k个数的组?...
如:combination(5,3)
要求输出Q?43Q?42Q?41Q?32Q?31Q?21Q?32Q?31Q?21Q?21Q?br>#include<stdio.h>

int pop(int *);
int push(int );
void combination(int ,int );

int stack[3]={0};
top=-1;

int main()
{
int n,m;
printf("Input two numbers:\n");
while( (2!=scanf("%d%*c%d",&n,&m)) )
{
fflush(stdin);
printf("Input error! Again:\n");
}
combination(n,m);
printf("\n");
}
void combination(int m,int n)
{
int temp=m;
push(temp);
while(1)
{
if(1==temp)
{
if(pop(&temp)&&stack[0]==n) //当栈底元素弹?amp;&为可能取的最|循环退?br>break;
}
else if( push(--temp))
{
printf("%d%d%d ",stack[0],stack[1],stack[2]);//§&auml;¨ì¤@?
pop(&temp);
}
}
}
int push(int i)
{
stack[++top]=i;
if(top<2)
return 0;
else
return 1;
}
int pop(int *i)
{
*i=stack[top--];
if(top>=0)
return 0;
else
return 1;
}

1、用指针的方法,字W串“ABCD1234efgh”前后对调昄
#include <stdio.h>
#include <string.h>
#include <dos.h>
int main()
{
char str[] = "ABCD1234efgh";
int length = strlen(str);
char * p1 = str;
char * p2 = str + length - 1;
while(p1 < p2)
{
char c = *p1;
*p1 = *p2;
*p2 = c;
++p1;
--p2;
}
printf("str now is %s\n",str);
system("pause");
return 0;
}
2、有一分数序列Q?/2,1/4,1/6,1/8……Q用函数调用的方法,求此数列?0的?br>#include <stdio.h>
double getValue()
{
double result = 0;
int i = 2;
while(i < 42)
{
result += 1.0 / i;//一定要使用1.0做除敎ͼ不能?Q否则结果将自动转化成整敎ͼ?.000000
i += 2;
}
return result;
}
int main()
{
printf("result is %f\n", getValue());
system("pause");
return 0;
}

有一个数la[1000]存放0--1000;要求每隔二个数删掉一个数Q到末尾时@环至开头l进行,求最后一个被删掉的数的原始下标位|?br>?个数ZQ?br>{0,1,2,3,4,5,6,7} 0-->1-->2Q删除)-->3-->4-->5(删除)-->6-->7-->0Q删除)Q如此@环直到最后一个数被删除?br>Ҏ1Q数l?br>#include <iostream>
using namespace std;
#define null 1000

int main()
{
int arr[1000];
for (int i=0;i<1000;++i)
arr[i]=i;
int j=0;
int count=0;
while(count<999)
{
while(arr[j%1000]==null)
j=(++j)%1000;
j=(++j)%1000;
while(arr[j%1000]==null)
j=(++j)%1000;
j=(++j)%1000;
while(arr[j%1000]==null)
j=(++j)%1000;
arr[j]=null;
++count;
}
while(arr[j]==null)
j=(++j)%1000;

cout<<j<<endl;
return 0;
}Ҏ2Q链?br>#include<iostream>
using namespace std;
#define null 0
struct node
{
int data;
node* next;
};
int main()
{
node* head=new node;
head->data=0;
head->next=null;
node* p=head;
for(int i=1;i<1000;i++)
{
node* tmp=new node;
tmp->data=i;
tmp->next=null;
head->next=tmp;
head=head->next;
}
head->next=p;
while(p!=p->next)
{
p->next->next=p->next->next->next;
p=p->next->next;
}
cout<<p->data;
return 0;
}
Ҏ3Q通用法
#include <stdio.h>
#define MAXLINE 1000 //元素个数
/*
MAXLINE 元素个数
a[] 元素数组
R[] 指针?br>suffix 下标
index q回最后的下标序号
values q回最后的下标对应的?br>start 从第几个开?br>K 间隔
*/
int find_n(int a[],int R[],int K,int& index,int& values,int s=0) {
int suffix;
int front_node,current_node;
suffix=0;
if(s==0) {
current_node=0;
front_node=MAXLINE-1;
}
else {
current_node=s;
front_node=s-1;
}
while(R[front_node]!=front_node) {
printf("%d\n",a[current_node]);
R[front_node]=R[current_node];
if(K==1) {
current_node=R[front_node];
continue;
}
for(int i=0;i<K;i++){
front_node=R[front_node];
}
current_node=R[front_node];
}
index=front_node;
values=a[front_node];

return 0;
}
int main(void) {
int a[MAXLINE],R[MAXLINE],suffix,index,values,start,i,K;
suffix=index=values=start=0;
K=2;

for(i=0;i<MAXLINE;i++) {
a[i]=i;
R[i]=i+1;
}
R[i-1]=0;
find_n(a,R,K,index,values,2);
printf("the value is %d,%d\n",index,values);
return 0;
}

试题Q?
void test2()
{
char string[10], str1[10];
int i;
for(i=0; i<10; i++)
{
str1[i] = 'a';
}
strcpy( string, str1 );
}
? {:对试?Q如果面试者指出字W数lstr1不能在数l内l束可以l?分;如果面试者指出strcpy(string, str1)调用使得从str1内存起复制到string内存h复制的字节数h不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10 分;
str1不能在数l内l束:因ؓstr1的存储ؓQ{a,a,a,a,a,a,a,a,a,a},没有'\0'(字符串结束符)Q所以不能结?br>strcpy( char *s1,char *s2)他的工作原理是,扫描s2指向的内存,逐个字符付到s1所指向的内存,直到到'\0',因ؓstr1l尾没有'\0'Q所以具有不定性,不知道他后面q会付什么东东?br>正确应如?br>void test2()
{
char string[10], str1[10];
int i;
for(i=0; i<9; i++)
{
str1[i] = 'a'+i; //把abcdefghi赋值给字符数组
}
str[i]='\0';//加上l束W?br>strcpy( string, str1 );
}

W二个code题是实现strcmp
int StrCmp(const char *str1, const char *str2)
做是做对了,没有抄搞Q比较ؕ
int StrCmp(const char *str1, const char *str2)
{
assert(str1 && srt2);
while (*str1 && *str2 && *str1 == *str2) {
str1++, str2++;
}
if (*str1 && *str2)
return (*str1-*str2);
elseif (*str1 && *str2==0)
return 1;
elseif (*str1 = = 0 && *str2)
return -1;
else
return 0;
}

int StrCmp(const char *str1, const char *str2)
{
//省略判断I指?自己保证)
while(*str1 && *str1++ = = *str2++);
return *str1-*str2;
}
W三个code题是实现子串定位
int FindSubStr(const char *MainStr, const char *SubStr)
做是做对了,没有抄搞Q比较ؕ
int MyStrstr(const char* MainStr, const char* SubStr)
{
const char *p;
const char *q;
const char * u = MainStr;

//assert((MainStr!=NULL)&&( SubStr!=NULL));//用断a对输入进行判?br>while(*MainStr) //内部q行递增
{
p = MainStr;
q = SubStr;
while(*q && *p && *p++ == *q++);
if(!*q )
{
return MainStr - u +1 ;//MainStr指向当前起始位,u指向
}
MainStr ++;
}
return -1;
}

分析Q?br>int arr[] = {6,7,8,9,10};
int *ptr = arr;
*(ptr++)+=123;
printf(“ %d %d ”, *ptr, *(++ptr));
输出Q? 8
q程Q对?(ptr++)+=123;先做加法6+123Q然?+Q指针指?Q对于printf(“ %d %d ”, *ptr, *(++ptr));从后往前执行,指针?+Q指?Q然后输?Q紧接着再输?

华ؓ全套完整试题
高?br>6、已知一个单向链表的_请写出删除其某一个结点的法Q要求,先找到此l点Q然后删除?br>slnodetype *Delete(slnodetype *Head,int key){}中if(Head->number==key)
{
Head=Pointer->next;
free(Pointer);
break;
}
Back = Pointer;
Pointer=Pointer->next;
if(Pointer->number==key)
{
Back->next=Pointer->next;
free(Pointer);
break;
}
void delete(Node* p)
{
if(Head = Node)

while(p)
}

有一?6位的整数Q每4位ؓ一个数Q写函数求他们的和?br>解释Q?br>整数1101010110110111
?1101+0101+1011+0111
感觉应该不难Q当时对题理解的不是很清楚,所以写了一个函敎ͼ也不知道对不寏V?br>疑问Q?br>既然?6位的整数Q?101010110110111?q制的,那么函数参数怎么定义呢,请大虾指教?br>{案Q用十进制做参数Q计时按二q制考虑?br>/* n是16位的敎ͼ函数q回它的四个部分之和 */
char SumOfQuaters(unsigned short n)
{
char c = 0;
int i = 4;
do
{
c += n & 15;
n = n >> 4;
} while (--i);

return c;
}



?,2,....一直到n的无序数l?求排序算?q且要求旉复杂度ؓO(n),I间复杂度O(1),使用交换,而且一ơ只能交换两个数.Q华为)
#include<iostream.h>

int main()
{
int a[] = {10,6,9,5,2,8,4,7,1,3};
int len = sizeof(a) / sizeof(int);
int temp;

for(int i = 0; i < len; )
{
temp = a[a[i] - 1];
a[a[i] - 1] = a[i];
a[i] = temp;

if ( a[i] == i + 1)
i++;
}
for (int j = 0; j < len; j++)
cout<<a[j]<<",";

return 0;
}

Q慧通)
1 写出E序把一个链表中的接炚w序倒排
typedef struct linknode
{
int data;
struct linknode *next;
}node;
//一个链表逆置
node *reverse(node *head)
{
node *p,*q,*r;
p=head;
q=p->next;
while(q!=NULL)
{
r=q->next;
q->next=p;
p=q;
q=r;
}

head->next=NULL;
head=p;
return head;
}
2 写出E序删除链表中的所有接?br>void del_all(node *head)
{
node *p;
while(head!=NULL)
{
p=head->next;
free(head);
head=p;
}
cout<<"释放I间成功!"<<endl;
}
3两个字符Ԍs,t;把t字符串插入到s字符串中Qs字符串有_的空间存放t字符?br>void insert(char *s, char *t, int i)
{
char *q = t;
char *p =s;
if(q == NULL)return;
while(*p!='\0')
{
p++;
}
while(*q!=0)
{
*p=*q;
p++;
q++;
}
*p = '\0';
}


分析下面的代码:
char *a = "hello";
char *b = "hello";
if(a= =b)
printf("YES");
else
printf("NO");
q个单的面试题目,我选输?no(Ҏ的应该是指针地址?,可在VC是YES 在C是NO
lz的呢Q是一个常量字W串。位于静态存储区Q它在程序生命期内恒定不变。如果编译器优化的话Q会有可能a和b同时指向同一个hello的。则地址相同。如果编译器没有优化Q那么就是两个不同的地址Q则不同



martin0501 2008-06-17 17:11 发表评论
]]>
[转] C面试ȝ(一)http://www.shnenglu.com/hyjune/articles/53726.htmlmartin0501martin0501Tue, 17 Jun 2008 09:04:00 GMThttp://www.shnenglu.com/hyjune/articles/53726.htmlhttp://www.shnenglu.com/hyjune/comments/53726.htmlhttp://www.shnenglu.com/hyjune/articles/53726.html#Feedback0http://www.shnenglu.com/hyjune/comments/commentRss/53726.htmlhttp://www.shnenglu.com/hyjune/services/trackbacks/53726.htmlhttp://blog.chinaunix.net/u/22968/showart_426807.html

 4. static有什么用途?Q请臛_说明两种Q?br>1.限制变量的作用域
2.讄变量的存储域
7. 引用与指针有什么区别?
1) 引用必须被初始化Q指针不必?br>2) 引用初始化以后不能被改变Q指针可以改变所指的对象?br>2) 不存在指向空值的引用Q但是存在指向空值的指针?br>
8. 描述实时pȝ的基本特?br>在特定时间内完成特定的Q务,实时性与可靠?br>9. 全局变量和局部变量在内存中是否有区别Q如果有Q是什么区别?
全局变量储存在静态数据库Q局部变量在堆栈
10. 什么是q二叉树?
左右子树都是q二叉?且左叛_树的深度差值的l对g大于1
11. 堆栈溢出一般是׃么原因导致的Q?br>没有回收垃圾资源
12. 什么函C能声明ؓ虚函敎ͼ
constructor
13. 冒排序法的时间复杂度是什么?
O(n^2)
14. 写出float x ?#8220;零?#8221;比较的if语句?br>if(x>0.000001&&x<-0.000001)
16. Internet采用哪种|络协议Q该协议的主要层ơ结构?
tcp/ip 应用?传输?|络?数据链\?物理?br>17. Internet物理地址和IP地址转换采用什么协议?
ARP (Address Resolution Protocol)Q地址解析協議Q?br>18.IP地址的编码分为哪俩部分?
IP地址׃部分l成Q网l号和主机号。不q是要和“子网掩码”按位与上之后才能区分哪些是网l位哪些是主Z?br>

2.用户输入M,N|?至N开始顺序@环数敎ͼ每数到M输出该数|直至全部输出。写出CE序?br>循环链表Q用取余操作?br>3.不能做switch()的参数类型是Q?br>switch的参C能ؓ实型?br>
華為
1、局部变量能否和全局变量重名Q?br>{:能,局部会屏蔽全局。要用全局变量Q需要?::"
局部变量可以与全局变量同名Q在函数内引用这个变量时Q会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言Q在同一个函数内可以定义多个同名的局部变量,比如在两个@环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个@环体?br>2、如何引用一个已l定义过的全局变量Q?br>{:extern
可以用引用头文g的方式,也可以用extern关键字,如果用引用头文g方式来引用某个在头文件中声明的全局变理Q假定你那个变写错了,那么在编译期间会报错Q如果你用extern方式引用Ӟ假定你犯了同L错误Q那么在~译期间不会报错Q而在q接期间报错
3、全局变量可不可以定义在可被多?C文g包含的头文g中?Z么?
{:可以Q在不同的C文g中以static形式来声明同名全局变量?br>可以在不同的C文g中声明同名的全局变量Q前提是其中只能有一个C文g中对此变量赋初|此时q接不会出错
4、语句for( Q? Q?有什么问题?它是什么意思?
{:和while(1)相同?br>5、do……while和while……do有什么区别?
{:前一个@环一遍再判断Q后一个判断以后再循环
6、请写出下列代码的输出内?br>#include<stdio.h>
main()
{
int a,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf("bQcQdQ?dQ?dQ?d"QbQcQdQ?
return 0;
}
{:10Q?2Q?20

1、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
? 局变量(外部变量)的说明之前再冠以static 构成了静态的全局变量。全局变量本n是静态存储方式, 静态全局变量当然也是静态存储方式? q两者在存储方式上ƈ无不同。这两者的区别虽在于非静态全局变量的作用域是整个源E序Q? 当一个源E序由多个源文gl成Ӟ非静态的全局变量在各个源文g中都是有效的?而静态全局变量则限制了其作用域Q?卛_在定义该变量的源文g内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文g内,只能源文件内的函数公用, 因此可以避免在其它源文g中引起错误?br>从以上分析可以看出, 把局部变量改变ؓ静态变量后是改变了它的存储方式x变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的用范围?br>static函数与普通函C用域不同。仅在本文g。只在当前源文g中用的函数应该说明为内部函?static)Q内部函数应该在当前源文件中说明和定义。对于可在当前源文g以外使用的函敎ͼ应该在一个头文g中说明,要用这些函数的源文件要包含q个头文?br>
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一ơ,防止在其他文件单元中被引?
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一ơ,下一ơ依据上一ơ结果|
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中l持一份拷?br>2、程序的局部变量存在于Q堆栈)中,全局变量存在于(静态区 Q中Q动态申h据存在于Q?堆)中?br>3、设有以下说明和定义Q?br>typedef union {long i; int k[5]; char c;} DATE;
struct data { int cat; DATE cow; double dog;} too;
DATE max;
则语?printf("%d",sizeof(struct date)+sizeof(max));的执行结果是Q___52____
{:DATE是一个union, 变量公用I间. 里面最大的变量cd是int[5], 占用20个字? 所以它的大是20
data是一个struct, 每个变量分开占用I间. 依次为int4 + DATE20 + double8 = 32.
所以结果是 20 + 32 = 52.
当然...在某?6位编辑器? int可能?字节,那么l果?int2 + DATE10 + double8 = 20
4、队列和栈有什么区别?
队列先进先出Q栈后进先出

5、写Z列代码的输出内容
#include<stdio.h>
int inc(int a)
{
return(++a);
}
int multi(int*a,int*b,int*c)
{
return(*c=*a**b);
}
typedef int(FUNC1)(int in);
typedef int(FUNC2) (int*,int*,int*);

void show(FUNC2 fun,int arg1, int*arg2)
{
INCp=&inc;
int temp =p(arg1);
fun(&temp,&arg1, arg2);
printf("%d\n",*arg2);
}

main()
{
int a;
show(multi,10,&a);
return 0;
}
{:110
7、请扑և下面代码中的所以错?br>说明Q以下代码是把一个字W串倒序Q如“abcd”倒序后变?#8220;dcba”

1?include"string.h"
2、main()
3、{
4?char*src="hello,world";
5?char* dest=NULL;
6?int len=strlen(src);
7?dest=(char*)malloc(len);
8?char* d=dest;
9?char* s=src[len];
10?while(len--!=0)
11?d++=s--;
12?printf("%s",dest);
13?return 0;
14、}
{:
Ҏ1Q?br>int main(){
char* src = "hello,world";
int len = strlen(src);
char* dest = (char*)malloc(len+1);//要ؓ\0分配一个空?br>char* d = dest;
char* s = &src[len-1];//指向最后一个字W?br>while( len-- != 0 )
*d++=*s--;
*d = 0;//N要加\0
printf("%s\n",dest);
free(dest);// 使用完,应当释放I间Q以免造成内存汇泄?br>return 0;
}
Ҏ2Q?br>#include <stdio.h>
#include <string.h>
main()
{
char str[]="hello,world";
int len=strlen(str);
char t;
for(int i=0; i<len/2; i++)
{
t=str[i];
str[i]=str[len-i-1]; str[len-i-1]=t;
}
printf("%s",str);
return 0;
}
1.-1,2,7,28,,126请问28?26中间那个数是什么?Z么?
W一题的{案应该?^3-1=63
规律是n^3-1(当n为偶?Q?Q?)
n^3+1(当n为奇?Q?Q?)
{案Q?3
2.用两个栈实现一个队列的功能Q要求给出算法和思\Q?br>?个栈为A,B, 一开始均为空.

入队:
新元素push入栈A;

出队:
(1)判断栈B是否为空Q?br>(2)如果不ؓI,则将栈A中所有元素依ơpop出ƈpush到栈BQ?br>(3)栈B的栈元素pop出;

q样实现的队列入队和出队的^摊复杂度都还是O(1), 比上面的几种Ҏ要好?.在c语言库函C一个字W{换成整型的函数是atool()吗,q个函数的原型是什么?
函数? atol
?? 把字W串转换成长整型?
?? long atol(const char *nptr);
E序?
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
long l;
char *str = "98765432";

l = atol(lstr);
printf("string = %s integer = %ld\n", str, l);
return(0);
}

2.对于一个频J用的短小函数,在C语言中应用什么实?在C++中应用什么实?
c用宏定义Qc++用inline
3.直接链接两个信o点的一l链路称作什?
PPP点到点连?br>4.接入|用的是什么接?
5.voip都用了那些协?
6.软g试都有那些U类?
黑盒Q针对系l功能的试 白合Q测试函数功能,各函数接?br>7.定模块的功能和模块的接口是在Y件设计的那个队段完成?
概要设计阶段
8.enum string
{
x1,
x2,
x3=10,
x4,
x5,
}x;
问x= 0x801005Q?x8010f4 ;
9.unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
请问p1+5= ;
p2+5= ;
?选择?
1.Ethternet链接到Internet用到以下那个协议?
A.HDLC;B.ARP;C.UDP;D.TCP;E.ID
2.属于|络层协议的?
A.TCP;B.IP;C.ICMP;D.X.25
3.Windows消息调度机制?
A.指o队列;B.指o堆栈;C.消息队列;D.消息堆栈;
4.unsigned short hash(unsigned short key)
{
return (key>>)%256
}
请问hash(16),hash(256)的值分别是:
A.1.16;B.8.32;C.4.16;D.1.32
?N?
1.请问下面E序有什么错?
int a[60][250][1000],i,j,k;
for(k=0;k<=1000;k++)
for(j=0;j<250;j++)
for(i=0;i<60;i++)
a[i][j][k]=0;
把@环语句内外换一?br>2.#define Max_CB 500
void LmiQueryCSmd(Struct MSgCB * pmsg)
{
unsigned char ucCmdNum;
......

for(ucCmdNum=0;ucCmdNum<Max_CB;ucCmdNum++)
{
......;
}
d@?br>3.以下是求一个数的^方的E序,h出错?
#define SQUARE(a)((a)*(a))
int a=5;
int b;
b=SQUARE(a++);
4.typedef unsigned char BYTE
int examply_fun(BYTE gt_len; BYTE *gt_code)
{
BYTE *gt_buf;
gt_buf=(BYTE *)MALLOC(Max_GT_Length);
......
if(gt_len>Max_GT_Length)
{
return GT_Length_ERROR;
}
.......
}
?问答?
1.IP Phone的原理是什?
IPV6
2.TCP/IP通信建立的过E怎样Q端口有什么作用?
三次握手Q确定是哪个应用E序使用该协?br>3.1号信令和7号信令有什么区别,我国某前q泛使用的是那一U?
4.列D5U以上的电话C务?

微Y亚洲技术中心的面试题!Q!
1Q进E和U程的差别?br>U程是指q程内的一个执行单?也是q程内的可调度实?
与进E的区别:
(1)调度Q线E作度和分配的基本单位,q程作ؓ拥有资源的基本单?br>(2)q发性:不仅q程之间可以q发执行Q同一个进E的多个U程之间也可q发执行
(3)拥有资源Q进E是拥有资源的一个独立单位,U程不拥有系l资源,但可以访问隶属于q程的资?
(4)pȝ开销Q在创徏或撤消进E时Q由于系l都要ؓ之分配和回收资源Q导致系l的开销明显大于创徏或撤消线E时的开销?br>2.试Ҏ
人工试Q个人复查、抽查和会审
机器试Q黑盒测试和白盒试

2QHeap与stack的差别?br>Heap是堆Qstack是栈?br>Stack的空间由操作pȝ自动分配/释放QHeap上的I间手动分配/释放?br>StackI间有限QHeap是很大的自由存储?br>C中的malloc函数分配的内存空间即在堆?C++中对应的是new操作W?br>E序在编译期对变量和函数分配内存都在栈上q行,且程序运行过E中函数调用时参数的传递也在栈上进?br>3QWindows下的内存是如何管理的Q?br>4Q介l?Net?Net的安全性?br>5Q客L如何讉K.Netlg实现Web ServiceQ?br>6QC/C++~译器中虚表是如何完成的Q?br>7Q谈谈COM的线E模型。然后讨E内/外组件的差别?br>8Q谈谈IA32下的分页机制
页(4K)两分页模式Q大?4M)一U?br>9Q给两个变量Q如何找Z个带环单链表中是什么地方出现环的?
一个递增一Q一个递增二,他们指向同一个接Ҏ是环出现的地方
10Q在IA32中一共有多少U办法从用户态蟩到内核态?
通过调用门,从ring3到ring0Q中断从ring3到ring0Q进入vm86{等
11Q如果只惌E序有一个实例运行,不能q行两个。像winamp一P只能开一个窗口,怎样实现Q?br>用内存映或全局原子Q互斥变量)、查扄口句?.
FindWindowQ互斥,写标志到文g或注册表,׃n内存? 
12Q如何截取键盘的响应Q让所有的‘a’变成‘b’Q?br>键盘钩子SetWindowsHookEx
 13QApartment在COM中有什么用Qؓ什么要引入Q?br> 14Q存储过E是什么?有什么用Q有什么优点?
我的理解是一堆sql的集合,可以建立非常复杂的查询,~译q行Q所以运行一ơ后Q以后再q行速度比单独执行SQL快很?br> 15QTemplate有什么特点?什么时候用Q?br>16Q谈谈Windows DNAl构的特点和优点?br>

|络~程中设计ƈ发服务器Q用多q程 ?多线E?Q请问有什么区别?
1Q进E:子进E是父进E的复制品。子q程获得父进E数据空间、堆和栈的复制品?br>2Q线E:相对与进E而言Q线E是一个更加接q与执行体的概念Q它可以与同q程的其他线E共享数据,但拥有自q栈空_拥有独立的执行序列?br>两者都可以提高E序的ƈ发度Q提高程序运行效率和响应旉?br>U程和进E在使用上各有优~点Q线E执行开销,但不利于资源理和保护;而进E正相反。同ӞU程适合于在SMP机器上运行,而进E则可以跨机器迁UR?br>
思科
1. 用宏定义写出swapQxQyQ?br>#define swap(x, y)\
x = x + y;\
y = x - y;\
x = x - y;
2.数组a[N]Q存放了1至N-1个数Q其中某个数重复一ơ。写一个函敎ͼ扑և被重复的数字.旉复杂度必MؓoQNQ函数原型:
int do_dup(int a[],int N)
3 一语句实现x是否?的若q次q的判断
int i = 512;
cout << boolalpha << ((i & (i - 1)) ? false : true) << endl;
4.unsigned int intvert(unsigned int x,int p,int n)实现对x的进行{?pv始{化位,n为需要{换的长度,假设起始点在双.如x=0b0001 0001,p=4,n=3转换后x=0b0110 0001
unsigned int intvert(unsigned int x,int p,int n){
unsigned int _t = 0;
unsigned int _a = 1;
for(int i = 0; i < n; ++i){
_t |= _a;
_a = _a << 1;
}
_t = _t << p;
x ^= _t;
return x;
}

慧通:
什么是预编?br>何时需要预~译Q?br>Q、L使用不经常改动的大型代码体?
Q、程序由多个模块l成Q所有模块都使用一l标准的包含文g和相同的~译选项。在q种情况下,可以所有包含文仉~译Z个预~译头?br>char * const p;
char const * p
const char *p

上述三个有什么区别?
char * const p; //帔R指针Qp的g可以修改
char const * pQ?/指向帔R的指针,指向的常量g可以?br>const char *pQ?//和char const *p

char str1[] = "abc";
char str2[] = "abc";

const char str3[] = "abc";
const char str4[] = "abc";

const char *str5 = "abc";
const char *str6 = "abc";

char *str7 = "abc";
char *str8 = "abc";


cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;
cout << ( str5 == str6 ) << endl;
cout << ( str7 == str8 ) << endl;

l果是:0 0 1 1
解答Qstr1,str2,str3,str4是数l变量,它们有各自的内存I间Q?br>而str5,str6,str7,str8是指针,它们指向相同的常量区域?br>

12. 以下代码中的两个sizeof用法有问题吗Q[C易]
void UpperCase( char str[] ) // ?str 中的写字母转换成大写字?br>{
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如用于数l,只能出静态数l的大小Q无法检动态分配的或外部数l大。函数外的str是一个静? 定义的数l,因此其大ؓ6Q函数内的str实际只是一个指向字W串的指针,没有M额外的与数组相关的信息,因此sizeof作用于上只将其当指针看, 一个指针ؓ4个字节,因此q回4?br>
一?2位的机器,该机器的指针是多位
指针是多位只要看地址ȝ的位数就行了?0386以后的机子都?2的数据ȝ。所以指针的位数是4个字节了?br>
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);

printf("%d,%d",*(a+1),*(ptr-1));
}
输出Q?,5
*(a+1Q就是a[1]Q?(ptr-1)是a[4],执行l果?Q?
&a+1不是首地址+1Q系l会认ؓ加一个a数组的偏U,是偏UM一个数l的大小Q本例是5个intQ?br>int *ptr=(int *)(&a+1);
则ptr实际?amp;(a[5]),也就是a+5
原因如下Q?br>&a是数l指针,其类型ؓ int (*)[5];
而指针加1要根据指针类型加上一定的|
不同cd的指?1之后增加的大不?br>a是长度ؓ5的int数组指针Q所以要?5*sizeof(int)
所以ptr实际是a[5]
但是prt?&a+1)cd是不一L(q点很重?
所以prt-1只会减去sizeof(int*)
a,&a的地址是一LQ但意思不一Pa是数l首地址Q也是a[0]的地址Q?amp;a是对象(数组Q首地址Qa+1是数l下一元素的地址Q即a[1],&a+1是下一个对象的地址Q即a[5].


1.请问以下代码有什么问题:
int main()
{
char a;
char *str=&a;
strcpy(str,"hello");
printf(str);
return 0;
}
没有为str分配内存I间Q将会发生异?br>问题出在一个字W串复制q一个字W变量指针所指地址。虽然可以正输出结果,但因界进行内在读写而导致程序崩溃?br>
char* s="AAA";
printf("%s",s);
s[0]='B';
printf("%s",s);
有什么错Q?br>"AAA"是字W串帔R。s是指针,指向q个字符串常量,所以声明s的时候就有问题?br>cosnt char* s="AAA";
然后又因为是帔RQ所以对是s[0]的赋值操作是不合法的?/p>

1、写一?#8220;标准”宏,q个宏输入两个参数ƈq回较小的一个?br>.#define Min(X, Y) ((X)>(Y)?(Y):(X))//l尾没有;
2、嵌入式pȝ中经常要用到无限循环Q你怎么用C~写d@环?br>while(1){}或者for(;;)
3、关键字static的作用是什么?
定义静态变?br>4、关键字const有什么含意?
表示帔R不可以修改的变量?br>5、关键字volatile有什么含意?qDZ个不同的例子Q?br>提示~译器对象的值可能在~译器未监测到的情况下改变?br>

int (*s[10])(int) 表示的是什么啊
int (*s[10])(int) 函数指针数组Q每个指针指向一个int func(int param)的函数?br>

1.有以下表辑ּQ?br>int a=248; b=4;int const c=21;const int *d=&a;
int *const e=&b;int const *f const =&a;
请问下列表达式哪些会被编译器止Qؓ什么?
*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;
*c q是个什么东东,止
*d 说了是constQ?止
e = &a 说了是const 止
const *f const =&a; 止
2.交换两个变量的|不用第三个变量。即a=3,b=5,交换之后a=5,b=3;
有两U解? 一U用术法, 一U用^(异或)
a = a + b;
b = a - b;
a = a - b;
or
a = a^b;// 只能对int,char..
b = a^b;
a = a^b;
or
a ^= b ^= a;
3.c和c++中的struct有什么不同?
c和c++中struct的主要区别是c中的struct不可以含有成员函敎ͼ而c++中的struct可以。c++中struct和class的主要区别在于默认的存取权限不同Qstruct默认为publicQ而class默认为private
4.#include <stdio.h>
#include <stdlib.h>
void getmemory(char *p)
{
p=(char *) malloc(100);
strcpy(p,"hello world");
}
int main( )
{
char *str=NULL;
getmemory(str);
printf("%s/n",str);
free(str);
return 0;
}
E序崩溃Qgetmemory中的malloc 不能q回动态内存, freeQ)对str操作很危?br>5.char szstr[10];
strcpy(szstr,"0123456789");
产生什么结果?Z么?
长度不一P会造成非法的OS
6.列D几种q程的同步机Ӟq比较其优缺炏V?br>原子操作
信号量机?br>自旋?br>程Q会合,分布式系l?br>
7.q程之间通信的途径
׃n存储pȝ
消息传递系l?br>道Q以文gpȝ为基
11.q程死锁的原?br>资源竞争及进E推q顺序非?br>12.死锁?个必要条?br>互斥、请求保持、不可剥夺、环?br>13.死锁的处?br>鸵鸟{略、预防策略、避免策略、检与解除死锁
15. 操作pȝ中进E调度策略有哪几U?
FCFS(先来先服?Q优先Q时间片轮{Q多U反?br>8.cȝ静态成员和非静态成员有何区别?
cȝ静态成员每个类只有一个,非静态成员每个对象一?br>9.U虚函数如何定义Q用时应注意什么?
virtual void f()=0;
是接口,子类必须要实?br>10.数组和链表的区别
数组Q数据顺序存储,固定大小
q表Q数据可以随机存储,大小可动态改?br>
12.ISO的七层模型是什么?tcp/udp是属于哪一层?tcp/udp有何优缺点?
应用?br>表示?br>会话?br>q输?br>|络?br>物理链\?br>物理?br>tcp /udp属于q输?br>TCP 服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等?br>?TCP 不同Q?UDP q不提供?IP 协议的可靠机制、流控制以及错误恢复功能{。由?UDP 比较单, UDP 头包含很的字节Q比 TCP 负蝲消耗少?br>tcp: 提供E_的传输服务,有流量控Ӟ~点是包头大Q冗余性不?br>udp: 不提供稳定的服务Q包头小Q开销?


1Q?void *)ptr ?(*(void**))ptr的结果是否相同?其中ptr为同一个指?br>.(void *)ptr ?(*(void**))ptr值是相同?br>2Qint main()
{
int x=3;
printf("%d",x);
return 1;

}
问函数既然不会被其它函数调用Qؓ什么要q回1Q?br>mian中,c标准认ؓ0表示成功Q非0表示错误。具体的值是某中具体出错信息


1Q要对绝对地址0x100000赋|我们可以?br>(unsigned int*)0x100000 = 1234;
那么要是惌E序跌{到绝对地址?x100000L行,应该怎么做?
*((void (*)( ))0x100000 ) ( );
首先要将0x100000强制转换成函数指??
(void (*)())0x100000
然后再调用它:
*((void (*)())0x100000)();
用typedef可以看得更直观些:
typedef void(*)() voidFuncPtr;
*((voidFuncPtr)0x100000)();
2Q已知一个数ltableQ用一个宏定义Q求出数据的元素个数
#define NTBL
#define NTBL (sizeof(table)/sizeof(table[0]))

面试? U程与进E的区别和联p? U程是否h相同的堆? dll是否有独立的堆栈?
q程是死的,只是一些资源的集合Q真正的E序执行都是U程来完成的Q程序启动的时候操作系l就帮你创徏了一个主U程?br>
每个U程有自q堆栈?br>DLL 中有没有独立的堆栈,q个问题不好回答Q或者说q个问题本n是否有问题。因为DLL中的代码是被某些U程所执行Q只有线E拥有堆栈,如果DLL中的代码? EXE中的U程所调用Q那么这个时候是不是说这个DLL没有自己独立的堆栈?如果DLL中的代码是由DLL自己创徏的线E所执行Q那么是不是说DLL有独 立的堆栈Q?br>
以上讲的是堆栈,如果对于堆来_每个DLL有自q堆,所以如果是从DLL中动态分配的内存Q最好是从DLL中删除,如果你从DLL中分配内存,然后在EXE中,或者另外一个DLL中删除,很有可能DE序崩溃


unsigned short A = 10;
printf("~A = %u\n", ~A);

char c=128;
printf("c=%d\n",c);

输出多少Qƈ分析q程
W一题,~A Q?xfffffff5,int?为-11Q但输出的是uint。所以输?294967285
W二题,cQ?x10,输出的是intQ最高位?Q是负数Q所以它的值就?x00的补码就?28Q所以输出-128?br>q两道题都是在考察二进制向int或uint转换时的最高位处理?br>
分析下面的程序:
void GetMemory(char **p,int num)
{
*p=(char *)malloc(num);

}
int main()
{
char *str=NULL;

GetMemory(&str,100);

strcpy(str,"hello");

free(str);

if(str!=NULL)
{
strcpy(str,"world");
}

printf("\n str is %s",str);
getchar();
}
问输出结果是什么?希望大家能说说原因,先谢谢了
输出str is world?br>free 只是释放的str指向的内存空?它本w的D是存在的.
所以free之后Q有一个好的习惯就是将str=NULL.
此时str指向I间的内存已被回?如果输出语句之前q存在分配空间的操作的话,q段存储I间是可能被重新分配l其他变量的,
管q段E序实是存在大大的问题Q上面各位已l说得很清楚了)Q但是通常会打印出world来?br>q是因ؓQ进E中的内存管理一般不是由操作pȝ完成的,而是由库函数自己完成的?br>? 你malloc一块内存的时候,理库向操作pȝ甌一块空_可能会比你申L大一些)Q然后在q块I间中记录一些管理信息(一般是在你甌的内存前? 一点)Qƈ可用内存的地址q回。但是释攑ֆ存的时候,理库通常都不会将内存q给操作pȝQ因此你是可以l访问这块地址的,只不q。。。。。。。。楼 上都说过了,最好别q么qӀ?br>
char a[10],strlen(a)Z么等?5Q运行的l果

#include "stdio.h"
#include "string.h"

void main()
{

char aa[10];
printf("%d",strlen(aa));
}

sizeof()和初不初始化Q没有关p;
strlen()和初始化有关?br>

char (*str)[20];/*str是一个数l指针,x向数l的指针Q?/
char *str[20];/*str是一个指针数l,其元素ؓ指针型数据.*/

long a=0x801010;
a+5=?
0x801010用二q制表示为:“1000 0000 0001 0000 0001 0000”Q十q制的gؓ8392720Q再加上5是8392725|?br>
1)l定l构struct A
{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
};问sizeof(A) = ?
l定l构struct A
{
char t:4; 4?br>char k:4; 4?br>unsigned short i:8; 8?
unsigned long m; // 偏移2字节保证4字节寚w
}; // ?字节
2)下面的函数实现在一个数上加一个数Q有什么错误?h正?br>int add_n ( int n )
{
static int i = 100;
i += n;
return i;
}
当你W二ơ调用时得不到正的l果Q难道你写个函数是Z调用一ơ?问题出?static上?


// 帮忙分析一?br>#include<iostream.h>
#include <string.h>
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
typedef struct AA
{
int b1:5;
int b2:2;
}AA;
void main()
{
AA aa;
char cc[100];
strcpy(cc,"0123456789abcdefghijklmnopqrstuvwxyz");
memcpy(&aa,cc,sizeof(AA));
cout << aa.b1 <<endl;
cout << aa.b2 <<endl;
}
{案?-16和1
首先sizeof(AA)的大ؓ4,b1和b2分别?bit?bit.
l过strcpy和memcpy?aa?个字节所存放的值是:
0,1,2,3的ASC码,?0110000,00110001,00110010,00110011
所以,最后一步:昄的是q4个字节的前5位,和之后的Q位
分别为:10000,?1
因ؓint是有正负之分  所以:{案?16和1

求函数返回|输入x=9999;
int func Q?x Q?br>{
int countx = 0;
while ( x )
{
countx ++;
x = x&(x-1);
}
return countx;
}
l果呢?
知道了这是统?999的二q制数g有多个1的函敎ͼ且有
9999Q?×1024Q?12Q?56Q?5

9×1024中含?的个Cؓ2Q?br>512中含?的个Cؓ1Q?br>256中含?的个Cؓ1Q?br>15中含?的个Cؓ4Q?br>故共?的个Cؓ8Q结果ؓ8?br>1000 - 1 = 0111Q正好是原数取反。这是原理?br>用这U方法来?的个数是很效率很高的?br>不必M个一个地UM。@环次数最?br>
int a,b,c 请写函数实现C=a+b ,不可以改变数据类?如将c改ؓlong int,关键是如何处理溢出问?br>bool add (int a, int b,int *c)
{
*c=a+b;
return (a>0 && b>0 &&(*c<a || *c<b) || (a<0 && b<0 &&(*c>a || *c>b)));
}


分析Q?br>struct bit
{ int a:3;
int b:2;
int c:3;
};
int main()
{
bit s;
char *c=(char*)&s;
cout<<sizeof(bit)<<endl;
*c=0x99;
cout << s.a <<endl <<s.b<<endl<<s.c<<endl;
int a=-1;
printf("%x",a);
return 0;
}
输出Z么是
4
1
-1
-4
ffffffff
因ؓ0x99在内存中表示?100 11 001 , a = 001, b = 11, c = 100
当c为有W合数时, c = 100, 最?Cc敎ͼ负数在计机用补码表C,所以c = -4;同理
b = -1;
当c为有W合数时, c = 100,?c = 4,同理 b = 3


位域 Q?
? 些信息在存储Ӟq不需要占用一个完整的字节Q?而只需占几个或一个二q制位。例如在存放一个开关量Ӟ只有0? 两种状态, 用一位二q位卛_。ؓ了节省存储空_q处理便,Q语a又提供了一U数据结构,UCؓ“位域”?#8220;位段”。所?#8220;位域”是把一个字节中的二q位划分为几 个不同的区域Q?q说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作? q样可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其Ş式ؓQ?
struct 位域l构?
{ 位域列表 };
其中位域列表的Ş式ؓQ?cd说明W?位域名:位域长度
例如Q?
struct bs
{
int a:8;
int b:2;
int c:6;
};
位域变量的说明与l构变量说明的方式相同?可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:
struct bs
{
int a:8;
int b:2;
int c:6;
}data;
说明data为bs变量Q共占两个字节。其中位域a?位,位域b?位,位域c?位。对于位域的定义有以下几点说明Q?

1. 一个位域必d储在同一个字节中Q不能跨两个字节。如一个字节所剩空间不够存攑֏一位域Ӟ应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:
struct bs
{
unsigned a:4
unsigned :0 /*I域*/
unsigned b:4 /*从下一单元开始存?/
unsigned c:4
}
在这个位域定义中Qa占第一字节?位,?位填0表示不用,b从第二字节开始,占用4位,c占用4位?

2. ׃位域不允许跨两个字节Q因此位域的长度不能大于一个字节的长度Q也是说不能超q?位二q位?

3. 位域可以无位域名Q这时它只用来作填充或调整位|。无名的位域是不能用的。例如:
struct k
{
int a:1
int :2 /*?位不能?/
int b:3
int c:2
};
从以上分析可以看出,位域在本质上是一U结构类型, 不过其成员是按二q位分配的?

二、位域的使用位域的用和l构成员的用相同,其一般Ş式ؓQ?位域变量?#8226;位域?位域允许用各U格式输出?
main(){
struct bs
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit,*pbit;
bit.a=1;
bit.b=7;
bit.c=15;
pri

攚wQ?br>#include <stdio.h>

int main(void) {

int **p;
int arr[100];

p = &arr;

return 0;
}
解答Q?br>搞错?是指针类型不?
int **p; //二指针
&arr; //得到的是指向W一lؓ100的数l的指针
#include <stdio.h>
int main(void) {
int **p, *q;
int arr[100];
q = arr;
p = &q;
return 0;
}


下面q个E序执行后会有什么错误或者效?
#define MAX 255
int main()
{
unsigned char A[MAX],i;//i被定义ؓunsigned char
for (i=0;i<=MAX;i++)
A[i]=i;
}
解答Q死循环加数l越界访问(C/C++不进行数l越界检查)
MAX=255
数组A的下标范围ؓ:0..MAX-1,q是其一..
其二.当i循环?55?循环内执?
A[255]=255;
q句本n没有问题..但是q回for (i=0;i<=MAX;i++)语句?
׃unsigned char的取D围在(0..255),i++以后i又ؓ0?.无限循环下去.

struct name1{
char str;
short x;
int num;
}

struct name2{
char str;
int num;
short x;
}

sizeof(struct name1)=8,sizeof(struct name2)=12
在第二个l构中,Z证num按四个字节对齐,char后必ȝ?字节的空_同时Z证整个结构的自然寚wQ这里是4字节寚wQ,在x后还要补?个字节,q样是12字节?br>
intelQ?br>A.c 和B.c两个c文g中用了两个相同名字的static变量,~译的时候会不会有问?q两个static变量会保存到哪里Q栈q是堆或者其他的Q?
static的全局变量Q表明这个变量仅在本模块中有意义Q不会媄响其他模块?br>他们都放在数据区Q但是编译器对他们的命名是不同的?br>如果要变量在其他模块也有意义的话,需要用extern关键字?br>
struct s1
{
int i: 8;
int j: 4;
int a: 3;
double b;
};

struct s2
{
int i: 8;
int j: 4;
double b;
int a:3;
};

printf("sizeof(s1)= %d\n", sizeof(s1));
printf("sizeof(s2)= %d\n", sizeof(s2));
result: 16, 24
W一个struct s1
{
int i: 8;
int j: 4;
int a: 3;
double b;
};
? Z是这LQ首先是i在相?的位|,?位一个字节,然后Qj在相对一个字节的位置Q由于一个位|的字节数是4位的倍数Q因此不用对齐,放在那? 了,然后是aQ要?位的倍数关系的位|上Q因此要UM位,?5位的位置上放下,目前d?8位,折算q来?字节2位的样子Q由于double? 字节的,因此要在相对0要是8个字节的位置上放下,因此?8位开始到8个字节之间的位置被忽略,直接攑֜8字节的位|了Q因此,d?6字节?br>
W二个最后会对照是不是结构体内最大数据的倍数Q不是的话,会补成是最大数据的倍数





martin0501 2008-06-17 17:04 发表评论
]]>
޹պŷۺϾþ| ˾Ʒþۺ| þҹɫƷŷ| ۲˾þþƷٸAV| ھƷþþӰԺ| Ʒþþ| ҹþӰԺ| þٸ۲AV| ͵þþþƷר| þ91Ʒþ91ۺ| þ99Ʒ | ޹ƷAVþۺӰԺ | þþþ޾Ʒþþþþþ | Ʒþþþþù˽| 99þþƷѹۿ| պAvĻþþ޸ | wwwԾþþcom| պþëƬ| þùۺϾƷ| þҹɫ˾Ʒ| þ99Ʒþþþþþþþ | Ʒ91þþþþþa| þþƷþý| þþƷ| ƷһþþƷɬ | þþþþþþƷŮ99| þֻоƷþ| vavavaþ| þ˳ƷCAOPOREN | þþƷAVþþ| 91ƷѾþþþþþþ| ۺ޾þһƷ| þ¾ƷĻ| aëƬþ| þۺϾþ߾Ʒ | ھƷþþþþҰ| þù׽| þþþ| 91ƷۺϾþ㽶 | þۺ˿ձ| þþžžƷ99Ʒ|