欢迎来到千学网!
您现在的位置:首页 > 实用文 > 其他范文

C++笔试

时间:2025-10-31 07:30:09 其他范文 收藏本文 下载本文

下面小编为大家整理了C++笔试,本文共10篇,欢迎阅读与借鉴!

篇1:c笔试题目

1.求下面函数的返回值(微软)

int func(x)

{

int countx = 0;

while(x)

{

countx ++;

x = x&(x-1);

}

return countx;

}

假定x = 9999。 答案:8

思路:将x转化为2进制,看含有的1的个数。

2. 什么是“引用”?申明和使用“引用”要注意哪些问题?

答:引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组的引用。

3. 将“引用”作为函数参数有哪些特点?

(1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。

(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。

(3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用“*指针变量名”的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。

4. 在什么时候需要使用“常引用”?

如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。常引用声明方式:const 类型标识符 &引用名=目标变量名;

例1

int a ;

const int &ra=a;

ra=1; //错误

a=1; //正确

例2

string foo( );

void bar(string & s);

那么下面的表达式将是非法的:

bar(foo( ));

bar(“hello world”);

原因在于foo( )和“hello world”串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。

引用型参数应该在能被定义为const的情况下,尽量定义为const 。

篇2:c笔试题目

1. 已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数,请编写函数 strcpy。

答案:

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 ;

}

2. 已知String类定义如下:

class String

{

public:

String(const char *str = NULL); // 通用构造函数

String(const String &another); // 拷贝构造函数

~ String; // 析构函数

String & operater =(const String &rhs); // 赋值函数

private:

char *m_data; // 用于保存字符串

};

尝试写出类的成员函数实现。

答案:

String::String(const char *str)

{

if ( str == NULL ) //strlen在参数为NULL时会抛异常才会有这步判断

{

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; //删除原来的数据,新开一块内存

m_data = new char[strlen(rhs.m_data) + 1];

strcpy(m_data,rhs.m_data);

return *this ;

}

String::~String

{

delete m_data ;

}

3. .h头文件中的ifndef/define/endif 的作用?

答:防止该头文件被重复引用。

4. #i nclude 与 #i nclude “file.h”的区别?

答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。

5.在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?

首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。

通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数

extern “C”是连接申明(linkage declaration),被extern “C”修饰的变量和函数是按照C语言方式编译和连接的,来看看C++中对类似C的函数是怎样编译的:

作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:

void foo( int x, int y );

该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。

_foo_int_int 这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。

同样地,C++中的变量除支持局部变量外,还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名,我们以“.”来区分。而本质上,编译器在进行编译时,与函数的处理相似,也为类中的变量取了一个独一无二的名字,这个名字与用户程序中同名的全局变量名字不同。

未加extern “C”声明时的连接方式

假设在C++中,模块A的头文件如下:

// 模块A头文件 moduleA.h

#ifndef MODULE_A_H

#define MODULE_A_H

int foo( int x, int y );

#endif

在模块B中引用该函数:

// 模块B实现文件 moduleB.cpp

#i nclude “moduleA.h”

foo(2,3);

实际上,在连接阶段,连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号!

加extern “C”声明后的编译和连接方式

加extern “C”声明后,模块A的头文件变为:

// 模块A头文件 moduleA.h

#ifndef MODULE_A_H

#define MODULE_A_H

extern “C” int foo( int x, int y );

#endif

在模块B的实现文件中仍然调用foo( 2,3 ),其结果是:

(1)模块A编译生成foo的目标代码时,没有对其名字进行特殊处理,采用了C语言的方式;

(2)连接器在为模块B的目标代码寻找foo(2,3)调用时,寻找的是未经修改的符号名_foo。

如果在模块A中函数声明了foo为extern “C”类型,而模块B中包含的是extern int foo( int x, int y ) ,则模块B找不到模块A中的函数;反之亦然。

所以,可以用一句话概括extern “C”这个声明的真实目的(任何语言中的任何语法特性的诞生都不是随意而为的,来源于真实世界的需求驱动。我们在思考问题时,不能只停留在这个语言是怎么做的,还要问一问它为什么要这么做,动机是什么,这样我们可以更深入地理解许多问题):实现C++与C及其它语言的混合编程。

明白了C++中extern “C”的设立动机,我们下面来具体分析extern “C”通常的使用技巧:

extern “C”的惯用法

(1)在C++中引用C语言中的函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行下列处理:

extern “C”

{

#i nclude “cExample.h”

}

而在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern “C”声明,在.c文件中包含了extern “C”时会出现编译语法错误。

C++引用C函数例子工程中包含的三个文件的源代码如下:

/* c语言头文件:cExample.h */

#ifndef C_EXAMPLE_H

#define C_EXAMPLE_H

extern int add(int x,int y);

#endif

/* c语言实现文件:cExample.c */

#i nclude “cExample.h”

int add( int x, int y )

{

return x + y;

}

// c++实现文件,调用add:cppFile.cpp

extern “C”

{

#i nclude “cExample.h”

}

int main(int argc, char* argv)

{

add(2,3);

return 0;

}

如果C++调用一个C语言编写的.DLL时,当包括.DLL的头文件或声明接口函数时,应加extern “C” { }。

(2)在C中引用C++语言中的函数和变量时,C++的头文件需添加extern “C”,但是在C语言中不能直接引用声明了extern “C”的该头文件,应该仅将C文件中将C++中定义的extern “C”函数声明为extern类型。

C引用C++函数例子工程中包含的三个文件的源代码如下:

//C++头文件 cppExample.h

#ifndef CPP_EXAMPLE_H

#define CPP_EXAMPLE_H

extern “C” int add( int x, int y );

#endif

//C++实现文件 cppExample.cpp

#i nclude “cppExample.h”

int add( int x, int y )

{

return x + y;

}

/* C实现文件 cFile.c

/* 这样会编译出错:#i nclude “cExample.h” */

extern int add( int x, int y );

int main( int argc, char* argv )

{

add( 2, 3 );

return 0;

}

篇3:c笔试题目

1. 将“引用”作为函数返回值类型的格式、好处和需要遵守的规则?

格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 }

好处:在内存中不产生被返回值的副本;(注意:正是因为这点原因,所以返回一个局部变量的引用是不可取的。因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error!

注意事项:

(1)不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了“无所指”的引用,程序会进入未知状态。

(2)不能返回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。

(3)可以返回类成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。

(4)流操作符重载返回值申明为“引用”的作用:

流操作符<<和>>,这两个操作符常常希望被连续使用,例如:cout << “hello” << endl; 因此这两个操作符的返回值应该是一个仍然支持这两个操作符的流引用。可选的其它方案包括:返回一个流对象和返回一个流对象指针。但是对于返回一个流对象,程序必须重新(拷贝)构造一个新的流对象,也就是说,连续的两个<<操作符实际上是针对不同对象的!这无法让人接受。对于返回一个流指针则不能连续使用<<操作符。因此,返回一个流对象引用是惟一选择。这个唯一选择很关键,它说明了引用的重要性以及无可替代性,也许这就是C++语言中引入引用这个概念的原因吧。赋值操作符=。这个操作符象流操作符一样,是可以连续使用的,例如:x = j = 10;或者(x=10)=100;赋值操作符的返回值必须是一个左值,以便可以被继续赋值。因此引用成了这个操作符的惟一返回值选择。

例3

#i nclude

int &put(int n);

int vals[10];

int error=-1;

void main

{

put(0)=10; //以put(0)函数值作为左值,等价于vals[0]=10;

put(9)=20; //以put(9)函数值作为左值,等价于vals[9]=20;

cout<

cout<

}

int &put(int n)

{

if (n>=0 && n<=9 ) return vals[n];

else { cout<<“subscript error”; return error; }

}

(5)在另外的一些操作符中,却千万不能返回引用:+-*/ 四则运算符。它们不能返回引用,Effective C++[1]的Item23详细的讨论了这个问题。主要原因是这四个操作符没有side effect,因此,它们必须构造一个对象作为返回值,可选的方案包括:返回一个对象、返回一个局部变量的引用,返回一个new分配的对象的引用、返回一个静态对象引用。根据前面提到的引用作为返回值的三个规则,第2、3两个方案都被否决了。静态对象的引用又因为((a+b) == (c+d))会永远为true而导致错误。所以可选的只剩下返回一个对象了。

2. “引用”与多态的关系?

引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。

例4

Class A; Class B : Class A{...}; B b; A& ref = b;

3. “引用”与指针的区别是什么?

指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。此外,就是上面提到的对函数传ref和pointer的区别。

4. 什么时候需要“引用”?

流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。

以上 2-8 参考:

5. 结构与联合有和区别?

1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。

2. 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。

6. 下面关于“联合”的题目的输出?

a)

#i nclude

union

{

int i;

char x[2];

}a;

void main

{

a.x[0] = 10;

a.x[1] = 1;

printf(“%d”,a.i);

}

答案:266 (低位低地址,高位高地址,内存占用情况是Ox010A)

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;

}

答案: AB (0x41对应'A',是低位;Ox42对应'B',是高位)

6261 (number.i和number.half共用一块地址空间)

篇4:c软件开发笔试题目

1、(4分)用变量a给出下面的定义

a) 一个整型数;

b)一个指向整型数的指针;

c)一个指向指针的指针,它指向的指针是指向一个整型数;

d)一个有10个整型的数组;

e)一个有10个指针的数组,该指针是指向一个整型数;

f)一个指向有10个整型数数组的指针;

g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数;

h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数

答案:

a)int a

b)int *a;

c)int a;

d)int a[10];

e)int *a [10];

f) int (*a)[10]

g)int (*a)(int)

h) int( *a[10])(int)

2、(4分)请写出以下语句的输出结果:

Int i=43;

Int j=5;

Double f=25.45181;

a) printf(“i=%d,j=%d,f=%3.2f”,i,j,f);

b) printf(“i=%x,j=%06d,i/j=%d”,i,j,i/j);

答案:

A)i=43,j=5,f=25.45

(说明:本来应该输出最小3位有效数字,25.5,但是由于限定了2位小数,所以强制有2位小数,有效数字的个数就起不到强制作用了。如果是%3.1,则输出为25.5)

B)i=2B ,j=000005,i/j=8

(%x显示的是一个无符号的0x 16进制的整数,%06d输出的是6位数,不够6位数,前面补0,i/j两个整数相除,只取商的整数值)

3、(2分)请完成以下宏定义:

a)用预处理指令#define 声明一个常数,用以表明1年中有多少个秒(忽略闰年问题) b)写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个

答案:

a)#define SECONDS (365*24*60*60)UL

b) #define MIN(a,b) ((A)<(B)?(A):(B))

扩展:MAX宏 #define MAX ((A)>(B)?(A):(B))

ABS宏 #define ABS (((X)>0)?(X):(-(X)))

4、(6分)以下为32为windows下的c++程序,请计算:

a)

char str=”hello”;

char *p=str;

请计算:

sizeof(str)=6

sizeof(p)=4

strlen(p)=5

答案:6,字符串数组以\\0(空格为结尾,所以str数组空间大小为5+1)

4,计算的是指针的长度。

5,strlen函数区的字符指针str的长度,不包括空字符。

b)

void func(char str[100])

{

Void *p=malloc(100);

}

请计算:

sizeof(str)=100,:表示在内存中预分配的内存大小。

sizeof (p)=4

c)

int a[3]={1,2,3};

int b=sizeof(a)/sizeof(a[0]); sizeof(a)求的是数组的大小。

请计算:

b=3,对的。

5、(2分) 设有定义:int n=0,*p=&n,q=&p; 则以下选项中,正确的赋值语句是(d) a)p=1; b)*q=2; c)q=p; d)*p=5;

(c)改成q=&p; 才对。

6、(2分)const关键字的用途?(至少说明两种)

答案:

(1)可以定义 const 常量

(2)const 可以修饰函数的参数、返回值,甚至函数的定义体。被const 修饰的东 西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

(3)const可以用来修饰指针变量,控制指针变量的存取规则。

篇5:c软件开发笔试题目

1、(2分)typedef的c语言中频繁用以声明一个已经存在的数据类型的同义词。也可以用以预处理器做类似的事情。例如:

#define dps struct s*

Typedef struct s * tps;

以上两种情况的意图都是要定义dps和tps作为一个指向结构s指针。哪种方法更好一些呢?(如果有的话)为什么? 考虑安全性还是用typedef好,宏定义在编译时是不检查的,只是简单替换,而typedef编译时要检查的 typedef,而且typedef,define并非等价,如#define string1 char *

typedef char *string2;第二种才能达到预想效果, string1 a,b;

得到的b是char

define是做替换的,typedef 则是重新定义一种数据类型的。可以向int型一样使用的。

#define FIND(struct,e) (size_t) &(((struct*)0)->e)

typedef是语句( 以';'结尾)

Typedef。它在自己的作用域内给一个已经存在的类型一个别名

2、(8分) 以下是一组有关内存知识的问题,请仔细看题,回答:

Void GetMemory(char *p)

{

P=(char *)malloc(100);

}

Void Test(void)

{

Char *str=Null;

GetMemory(str);

Strcpy(str,”hello world”);

Printf(str);

}

请问运行Test函数会有什么样的结果?

a)__________程序崩溃,运行时错误___________________________

char *GetMemory(void)

{

Char p=”hello world”);

Return p;

}

Void Test(void)

{

Char *str=NULL;

Str=GetMemory;

Printf(str);

}

请问运行Test函数会有什么结果?

b)_______________ hello world ________________________________

void GetMemory2(char p,int num)

{

*p=(char *)malloc(num);

}

Void Test(void)

{

Char *str=NULL;

GetMemory(&str,100);

Strcpy(str,”hello”);

Printf(str);

}

请问运行Test函数会有什么结果?

c)_______ hello __________________________________________

void Test(void)

{

Char *str=(char *)malloc(100);

Strcpy(str,”hello”);

Free(str);

If(str!=NULL)

{

Strcpy(str,”world”);

Printf(str);

}

}、

请问运行test函数会有什么样的结果?

d)_______程序崩溃:因为释放str指针后,没有将指针置为null,所以指针变为野指针了。再执行cpy时会因为找不到指针的指向而导致程序崩溃,请编程时,注意这一点。 __________________________________________

3、(6分)请写出以下程序的输出结果:

Class A

{

Public:

A

{ Printf(“A constructed.\\n”);}

Virtual ~A

{printf(“A deconstructed.\\n”);}

Virtual void Fn

{printf(“A fn called.\\n”);} };

Class B:public A

{

Public:

B

{printf(“B constructed.\\n”);} Virtual ~B

{printf(“B deconstructed.\\n”);} Virtual void Fn

{printf(“B fn called.\\n”);} };

Class C:public B

{

Public:

C

{printf(“C constructed.\\n”);} Virtual ~C

{printf(“C deconstructed.\\n”);} Virtual void Fn

{printf(“C fn called.\\n”);} };

Void main(int argc,char* grgv) {

A *pA=new B;

If(pA!=NULL)

pA->fn;

B *pB=static_cast(pA);

If(pB!=NULL)

pB->fn;

C * pC=static_cast(pA); If(pC!=NULL)

pC->fn;

delete pA;

}

Answer:

A constructed

B constructed

B fn called

B fn called

B fn called

B deconstructed

A deconstructed

篇6:c软件开发笔试题目

1.(2分)以下说法错误的是:

A)指针和引用作为函数参数都可以改变实参

B)指针和引用都可以在定义后任意的改变指向,引用是不可以改变的。

C)引用必须在创建的时候初始化,而指针则不需要

D)不能空引用,但是可以有空指针

2、(2分) 运算符的重载形式有两种,重载为_重载为类的内部成员函数____________和_重载为类的友元函数______________________

3、(2分) main主函数执行完毕后,是否可能会再执行一段代码?请说明理由? 可以使用注册函数让程序在推出main之后,程序终止之前执行自定义的一些代码!

全局对象的构造函数会在main 函数之前执行

利用atexit函数可以在程序终止前完成一些“清理”工作——如果将指向一组函数的指针传递给atexit函数,那么在程序退出main函数后(此时程序还未终止)就能自动调用这组函数。在使用atexit函数时你要注意这样两点:

main 之前:预编译 全局变量的初始化等

main 之后:全局变量的释放

main函数执行之前,主要就是初始化系统相关资源

mainCRTStartup中被调用的

在main之前会调用一系列初始化函数来初始化这个进程

而在main之后会调用exit(int)来进行进程的清理工作。可以用_onexit 注册一个函数

,可以用_onexit 注册一个函数,它会在main 之后执行int fn1(void), fn2(void), fn3(void), fn4 (void);

可能会执行一些注册过的Hook

注意,atexit以栈的方式注册函数,后注册的函数会先执行。

_onexit和atexit一样是以占的方式注册函数的,后注册的函数会被先执行。

void main( void )

篇7:c语言笔试题目及答案

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。下面是c语言笔试题目及答案,请参考。

c语言笔试题目及答案

一、选择题((1)~(10)每小题2分,(11)~(50)每小题1分,共60分)

下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确的选

项涂写在答题卡相应位置上,答在试卷上不得分。

(1)数据的存储结构是指________。

A)存储在外存中的数据 B)数据所占的存储空间量

C)数据在计算机中的顺序存储方式 D)数据的逻辑结构在计算机中的表示

答案:D

评析:数据的逻辑结构在计算机存储空间中的存放形式形式称为数据的存储结构(也称数据的物理结构)。

(2)下列关于栈的描述中错误的是________。

A)栈是先进后出的线性表

B)栈只能顺序存储

C)栈具有记忆作用

D)对栈的插入与删除操作中,不需要改变栈底指针

答案:B

评析:栈是一种特殊的线性表,又称先进后出表(FILO―First In Last Out)。

(3)对于长度为n的线性表,在最坏情况下,下列各排序法所对应的比较次数中正确的是

________。

A)冒泡排序为n2 B)冒泡排序为n

C)快速排序为n D)快速排序为n(n一1)/2

答案:D

评析:假设线性表的长度为n,则在最坏情况下,冒泡排序需要经过n/2遍的从前往后扫描和n/2遍的从后往前扫描,需要比较次数为n(n-1)/2。快速排序法的最坏情况比较次数也是n(n-1)/2。

(4)对长度为n的线性表进行顺序查找,在最坏情况下所需要的比较次数为________。

A)log2n B)n/2 C)n D)n+l

答案:C

评析:顺序查找过程中,如果被查找的元素是线性表中的最后一个元素,或者元素不在线性表中,则需要与线性表中所有的元素进行比较。对长度为n的线性表进行顺序查找,在最坏情况下需要比较n次。

(5)下列对于线性链表的描述中正确的是________。

A)存储空间不一定是连续,且各元素的存储顺序是任意的

B)存储空间不一定是连续,且前件元素一定存储在后件元素的前面

C)存储空间必须连续,且前件元素一定存储在后件元素的前面

D)存储空间必须连续,且各元素的存储顺序是任意的

答案:A

评析:在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。

(6)下列对于软件测试的描述中正确的是________。

A)软件测试的目的是证明程序是否正确

B)软件测试的目的是使程序运行结果正确

C)软件测试的目的是尽可能多地发现程序中的错误

D)软件测试的目的是使程序符合结构化原则

答案:C

评析:关于软件测试的目的,Grenford J.Myers再《The Art of Software Testing》一书中给出了深刻的阐述,整体来说,软件测试的目的就是尽可能多地发现程序中的错误。

(7)为了使模块尽可能独立,要求________。

A)模块的内聚程度要尽量高,且各模块间的耦合程度要尽量强

B)模块的内聚程度要尽量高,且各模块间的耦合程度要尽量弱

C)模块的内聚程度要尽量低,且各模块间的耦合程度要尽量弱

D)模块的内聚程度要尽量低,且各模块间的耦合程度要尽量强

答案:B

评析:模块独立性是指每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。软件设计,应尽量做到高内聚,低耦合,有利于提高模块的独立性。

(8)下列描述中正确的是________。

A)程序就是软件

B)软件开发不受计算机系统的限制

C)软件既是逻辑实体,又是物理实体

D)软件是程序、数据与相关文档的集合

答案:D

评析:计算机软件是计算机系统中与硬件相互依存的另一部分,是包括程序、数据及相关文档的完整集合。

(9)数据独立性是数据库技术的重要特点之一,所谓数据独立性是指________。

A)数据与程序独立存放

B)不同的数据被存放在不同的文件中

C)不同的数据只能被对应的应用程序所使用

D)以上三种说法都不对

答案:D

评析:数据独立性是数据与程序间的互不依赖性,即数据库中数据独立于应用程序而不依赖于应用程序。也就是说,数据的逻辑结构、存储结构与存取方式的改变不会影响应用程序。选项A、B、C三种说法都是错误的。

(10)用树形结构表示实体之间联系的模型是________。

A)关系模型 B)网状模型 C)层次模型 D)以上三个都是

答案:C

评析:层次模型是最早发展起来的数据库模型,它的基本结构是树形结构。

(11)算法具有五个特性,以下选项中不属于算法特性的是________。

A)有穷性 B)简洁性 C)可行性 D)确定性

答案:B

评析:有穷性、确定性、有零个或多个输入、有一个或多个输出、有效性是算法的基本特性。

(12)以下选项中可作为C语言合法常量的是________。

A)-80. B)-080 C)-8e1.0 D)-80.0e

答案:A

评析:c语言的常量分为整型常量、实型常量和字符型常量。选项A属于实型常量中的十进制小数形式的表示法,是合法的。

(13)以下叙述中正确的是________。

A)用C程序实现的算法必须要有输入和输出操作

B)用C程序实现的算法可以没有输出但必须要输入

C)用C程序实现的算法可以没有输入但必须要有输出

D)用C程序实现的算法可以既没有输入也没有输出

答案:C

评析:算法的特性中包括“有零个或多个输入”及“有一个或多个输出”这两个特性。一个算法得到的结果就是算法的输出,没有输出的算法是没有意义的,所以一个算法必须至少有一个输出。

(14)以下不能定义为用户标识符的是________。

A)Main B)_0 C)_int D)sizeof

答案:D

评析:C语言规定标识符只能由字母、数字和下划线三种符号组成,而且第一个字符必须是字母或下划线。注意:大写字母和小写字母被认为是两个不同的字符。A中Main与主i函数名main不同。

(15)以下选项中不能作为合法常量的是________。

A)1.234e04 B)1.234e0.4 C)1.234e+4 D)1.234e0

答案:B

评析:指数形式的实型常量要求字每e(或E)之前必需有数字,且e后面的指数必须为整数,所以本题中选项B非法。

(16)数字字符0的ASCII值为48,若有以下程序

main

{char a=”1″,b=”2″;

printf(“%c,”,b++);

printf(“%d ”,b-a);

)

程序运行后的输出结果是________。

A) 3,2 B)50,2 C)2,2 D)2,50

答案:C

评析l执行语句“printf(“%c,ll,b++);”后,b的值变成字符3,执行“printf(“%d ”,b-a);”,即‘3’-‘1’。

(17)有以下程序

main( )

{

int m=12, n=34;

printf(“%d%d”,m++,++n);

printf(“%d%d ”,n++,++m);

}

程序运行后的输出结果是________。

A)12353514 B)12353513 C)12343514 D)12343513

答案:A

评析:执行“printf(“%d%d”m++,++n);”后,输出的是m和n+l的值1235,接着执行

“printf(“%d%d\n”,n++,++m);”输出n和m+l的值3514。

(18)有定义语句:int b;char c[10】;,则正确的输入语句是________。

A) scanf(“%d%s”,&b,&C); B) scanf(“%d%s”,&b,C);

C) scanf(“%d%s”,b,C); D) scanf(“%d%s”,b,&C);

答案:B

评析:scanf函数中的“格式控制”后面应当是地址,而不是变量名。对于变量,通过地址运算符“&”求出内存中的地址;对于数组c[10],数组名c即为数组在内存中的地址。

(19)有以下程序

main()

{int m,n,p;

scanf(“m=%dn=%dp=%d”,&m,&n,&p);

printf(“%d%d%d\n”,m,n,p);

}

若想从键盘上输入数据,使变量m中的值为123,n中的值为456,p中的值为789,

则正确的输入是________。

A) m。123n=456p=789 B) m=123 n=456 p=789

C) m=123,n=456,p=789 D) 123 456 789

答案:A

评析:根据本题的数据输入形式“scanf(“m=%dn=%dp=%d”&m,&n,&p);”说明在输入数据时,必须输入“m=”、“n=”、“p=”字符,且中间不能含有空格。

(20)有以下程序

main()

{ int a,b,d=25;

a=d/10%9;

b=a&&(-1);

printf(”%d,%d\n”,a,b);

}

程序运行后的输出结果是________。

A)6,l B)2,l C)6,0 D)2,0

答案:B

评析:本题中“a=d/10%9;”的值为25/10%9=2; “b=a&&(-1);”为2&&(-1)=1(注意:-1表示真,只有O才表示假),所以a,b的值分别为2,1。

(21)有以下程序

main()

{

int i=1 j=2,k=3;

if(i++==1&&(++j==3||k++==3))

printf(“%d%d%d\n”,i,j,k);

}

程序运行后的输出结果是________。

A)l 2 3 B)2 34 C) 2 2 3. D)2 3 3

答案:D

评析:执行“i++==1&&(++j==3‖k++==3)”时,表达式“i++==1”嗨值为真,其值为1,表达式“++j=3”的值为真,根据短路原理,右边的表达式“k++==3”不再进行运算。括号中表达的值为l,作与运算后整个表达式的值也为l,输出i.j,k时,由于未执行过k,所以它们的值分别为2,3,3。

(22)若整型变量a、b、c、d中的值依次为:1、4、3、2。则条件表达式a

A)l B)2 C)3 D)4

答案:A

评析:条件表达式的一般形式为:表达式17表达式2:表达式3

本题先求的是a

(23)有以下程序

main( )

{

int p[8]={11,12,13,14,15,16,17,18},i=O,j=0;

while(i++<7)if p[i]%2)j+-=p[i];

printf(“%d\n”,j);

}

程序运行后的输出结果是________。

A)42 B)45 C)56 D)60

答案:B

评析:本程序的作用是求除p[O]外的其它奇数的和。

(24)有以下程序

main()

{

char a[7]= “a0\OaO\0”; int i,j;

i=sizeof(a);j=strlen(a);

printf(“%d%d\n”,i,j);

)

程序运行后的输出结果是________。

A)2 2 B)76 C)7 2 D)6 2

答案:C

评析:c语言中以‘\0’作为字符串的结束符,且strlen()函数计算的是‘\0’字符前的所有字符的个数。数组定义以后系统就为其分配相应大小的内存空间,而不论其中有没有内容。

(25)以下能正确定义一维数组的选项是________。

A)int a[5]={0,1,2,3,4,5; B)char a[]={0,1,2,3,4,5};

C)char a={’A’,’B’,’C’}; D)int a[5]=”0123″;

答案:B

评析:选项A中定义的是5个数组元素,但赋值的时候赋的是6个元素,所以出错;选项c不符合数组定义形式,数组名后应加上“[]”;选项D的类型说明符错误,如果用char定义就对了;选项B中的0,1,2,3,4,5分别表示对应字符的ASCII码,所以选项B是正确的。

(26)有以下程序

int fl(int x,int y){return x>y?x:y;}

int f2(int x,int y){return x>y?y:x;}

main()

{

int a=4,b=3,c=5,d=2,e,f,g;

e=f2(f1(a,b),f1(c,d));f=fl(f2(a,b),f2(c,d));

g=a+b+c+d-e-f;

printf(“%d,%d,%d\n”,e,f,g);

)

程序运行后的输出结果是________。

A)4,3,7 B)3,4,7 C)5,2,7 D)2,5,7

答案:A

评析:函数n的功能是返回两个数中比较大的值,f2的功能是返回两个数中比较小的值。

(27)已有定义:char a[]=”xyz”,b[]={’x’,’y’,’z};,以下叙述中正确的是________。

A)数组a和b的长度相同 B)a数组长度小于b数组长度

C)a数组长度大于b数组长度 D)上述说法都不对

答案:C

评析:c语言规定‘\0’为字符串结束标志。所以“char a[]=“xyz””的数组长度为4,而“b[]={‘x’,‘y’,‘z’};”的数组长度为3,数组长度与strlen函数所求的长度不同,本题是指数组占内存空间的大小。

(28)有以下程序

Void f(int *x, int *y)

{

int t;

t= *x; *x=*y;’*y=t;

)

main( )

{

int a[8]={1,2,3,4,5,6,7,8},i,*p,*q;

p=a;q=&a[7];

while(p

{f(p,q); p++; qC;} 。

for(i=0;i<3;i++) printf(“%d”,a[1][i]);

}

程序运行后的输出结果是________。

A)8,2,3,4,5,6,7,1, B)5,6,7,8,1,2,3,4.

C)1,2,3,4,5,6,7,8, D)8,7,6,5,4,3,2,l,

答案:D

评析;本程序中函数f的作用是交换指针变量x和y所指向的存储单元的值。

(29)有以下程序

main()

{

im a[3][3],*p,i;

p=&a[0][o];

for(i=0;j<9;i++) p[i]=I;

for(i=0;j<3;i++)printf(“%d”,a[1][i]);

)

程序运行后的输出结果是________。

A)012 B)123 C)234 D)345

答案:D

评析:本题赋值后,a的数组元素的值分别为a[01[0]=0,a[0][1]=1,a[0][2]=2,a[1][0]=3,a[1][1]=4,a[1][2]=5,a[2][0]=6,a[2][1]=7,a[2][2]=8,故本题输出的值为345。

(30)以下叙述中错误的是________。

A)对于double类型数组,不可以直接用数组名对数组进行整体输入或输出

B)数组名代表的是数组所占存储区的首地址,其值不可改变

C)当程序执行中,数组元素的下标超出所定义的下标范围时,系统将给出“下标越

界”的出错信息

D)可以通过赋初值的方式确定数组元素的个数

答案:C

评析:在c语言中,如果出现下标越界的情况,系统不管在编译还是执行时都不会给出“下标越界”的错误提示。

(31)有以下程序

#define N20

fun(int a[],int n,int m)

{ int i,j;

for(i=m;i>=n;iC)a[i+1]=a[i];

}

main()

{

int i,a[N]={1,2,3,4,5,6,7,8,9,10};

fun(a,2,9);

for(i=O;i<5;i++) printf(“%d”,a[i]);

}

程序运行后的输出结果是________。

A)10234 B)12344 C)12334 D)12234

答案:C

评析:本题函数fun的作用是将指定的数组元素(从下标n到下标m)向后移一位。由函数调用“fun(a,2,9);”可知,函数fun用于将a[2]到a[9]的各元素依次向后移一位,移完后,a数组中各元素的值分别为1,2,3,3,4,5,6,7,8,9,10,故输出的前5个数组元素为12334。

(32)有以下程序

main()

{

int a[3][2]={0},(*ptr)[2],i,j;

for(i=0;i<2;i++) {ptr=a+i; scanf(“%d”,ptr); ptr++;}

for(i=0;i<3;i++)

{ for(i=0;j<2;j++) printf(“%2d”,a[i][j]);

printf(“\n”);

}

}

若运行时输入:1 2 3<回车>,则输出结果是________。

A)产生错误信息

B)l0 C)l 2 D)l 0

2 O 3 0 2 0

0 0 0 O 3 0

答案:B

评析:二维数组a,通过a[3][2]={0}将数组中的各个元素初始化为0,指针变量ptr,指向包含2个元素的一维数组。a[0][0]:l,a[1][0]=2,故本题的输出选B。

(33)有以下程序

prt(int *m, int n)

{ int i;

for(i=O;i

)

main()

{

int a[]={ 1,2,3,4,5 },i;

prt(a,5);

for(i=O;i<5;i++)

printf(“%d,”,a[i]);

程序运行后的输出结果是________。

A)l,2,3,4,5, B)2,3,4,5,6, C)3,4,5,6,7, D)2,3,4,5,1,

答案:B

评析:用数组名作函数实参时,不是把数组的值传递给形参,而是把实参数组的起始地址传递给形参数组,这样两个数组就共同占用同一段内存单元。

(34)有以下程序

main()

{ int a[]={1,2,3,4,5,6,7,8,9,0},*p;

for(p=a;p

}

程序运行后的输出结果是________。

A)l,2,3,4,5,6,7,8,9,0, B)2,3,4,5,6,7,8,9,10,1,

C)0,1,2,3,4,5,6,7,8,9, D)l,l,1,l,l,l,l,l,l,l,

答案:A

评析:c语言规定数组变量名代表数组的首地址,即第0号元素的地址。本题将a数组中的值全部输出,即为l,2,3,4,5,6,7,8,9,0,。

(35)有以下程序

#define P 3

void F(int x){return(P*x*x);}

main()

{printf(“%d\n”,F(3+5));}

程序运行后的输出结果是________。

A)192 B)29 C)25 D)编译出错

答案:D

评析:return语句用于从被调函数带回一个函数值。void关键字表示“无类型”,即不需要从被调函数中带回函数值,所以不需要return语句,故编译时出错。

(36)有以下程序

main()

{int c=35;printf(“%d\n”,c&C);}

程序运行后的输出结果是________。

A)0 B)70 C)35 D)1

答案:C

评析:按位“与”时,1&1=1,其他都等O。因为本题中相与的两个值相等,即对应位上的二进制值相等,所以“与”的结果也即为其值本身。

(37)以下叙述中正确的是________。

A)预处理命令行必须位于源文件的开头

B)在源文件的一行上可以有多条预处理命令

C)宏名必须用大写字母表示

D)宏替换不占用程序的运行时间

答案:D

评析:通常,预处理命令位于源文件的开头,也可以写在函数与函数之间;不能在一行上写多条预处理命令:宏名一般习惯用大写字母表示,以便与变量名相区别,但这并非规定,也可用小写字母。

(38)若有以下说明和定义

union dt

{int a;har b;ouble c;}data;

以下叙述中错误的是________。

A)data的每个成员起始地址都相同

B)变量data所占的内存字节数与成员c所占字节数相等

C)程序段:data.a=5;pintf(“%f ”,data.C);输出结果为5.000000

D)data可以作为函数的实参

答案:C

评析:union是表示共用体的关键字,成员a,b,c共占用同一个内存空间,data的每个成员起始地址都相同;共用体变量所占的内存长度等于最长的成员的长度,故变量’data所占的内存字节数与成员c所占字节数相等;执行“data.a=5;printf(“%f ”,data.C);”printf函数只是将内存中的数据以不同的类型输出,而不能将内存中的整型数据自动转换为等值的浮点数,故C是错误的。

(39)以下语句或语句组中,能正确进行字符串赋值的是________。

A)char*sp;*sp=”right!”; B)char s[lO];s=”right! “;

C)char s[10];*s=”right! “; D)char*sp=”right! “;

答案:D

评析:选项A定义了字符型的指针变量sp,则*sp存储的是第一个字符,而给它赋的是字符串,故错;

选项B表示代表数组的首地址,而题中给它赋的是字符串,所以错误;

选项c定义了一个字符型的数组s[10],再通过+s给数组元素赋初值,这时是与选项A相同的错误。

(40)设有如下说明

typedef struct ST

{long a; int b; char c[2];}NEW;

则下面叙述中正确的是________。

A)以上的说明形式非法 B)ST是一个结构体类型

C)NEW是一个结构体类型 D)NEW是一个结构体变量

答案:C

评析:typedef关键字用于声明一个新的类型名代替已有的类型名。

本题中如果没有用typedef进行定义的话,则struct ST为结构体类型,现在用typedef定义后,相当于用NEW代表了struct ST这一结构体类型,故NEW为结构体类型。

(41)有以下程序

main()

{ int a=1,b;

for(b=l;b<10;b++)

{ if(a>=8)break;

if(a%2==1){a+=5;continue;}

a-=3;

)

printf(“%d\n”,b);

}

程序运行后的输出结果是________。

A) 3 B)4 C) 5 D) 6

答案:B

评析:break和continue的区别是:continue语句只结束本次循环,而不是终止整个循环的执行;而break语句则是结束整个循环过程,.不再判断执行的条件是否成立。

(42)有以下程序

main()

{ char s[]=”l 59″,*p;

p=s;

printf(“%c”,*p++);printf(“%c”,*p++);

}

程序运行后的输出结果是________。

A)15 B)16 C)12 D)59

答案:A

评析:本题通过“p=s”将指针变量p指向字符数组s,在第一次输出时,由于++和*为同一优先级,“*p++”相于“+(p++)”。p指向s[1],输出为s[1]的值。

[c语言笔试题目及答案]

篇8:计算机二级c语言笔试题库

一、选择题((1)~(40)每题1分,(41)~(50)每题2分,共60分)

(1)在计算机中,一个字节所包含二进制位的个数是

A)2

B)4

C)8

D)16

(2)在多媒体计算机中,CD-ROM属于

A)存储媒体

B)传输媒体

C)表现媒体

D)表示媒体

(3)在DOS系统中,带有通配符的文件名*.*表示

A)硬盘上的全部文件

B)当前盘当前目录中的全部文件

C)当前盘上的全部文件

D)根目录中的全部文件

(4)十六进制数100转换为十进制数为

A)256

B)512

C)1024

D)64

(5)能将高级语言编写的源程序转换为目标程序的软件是

A)汇编程序

B)编辑程序

C)解释程序

D)编译程序

(6)在Internet中,用于在计算机之间传输文件的协议是

A)TELNET

B)BBS

C)FTP

D)WWW

(7)在Windows环境下,资源管理器左窗口中的某文件夹左边标有“+”标记表示

A)该文件夹为空

B)该文件夹中含有子文件夹

C)该文件夹中只包含有可执行文件

D)该文件夹中包含系统文件

(8)在Windows环境下,下列叙述中正确的是

A)在“开始”菜单中可以增加项目,也可以删除项目

B)在“开始”菜单中不能增加项目,也不能删除项目

C)在“开始”菜单中可以增加项目,但不能删除项目

D)在“开始”菜单中不能增加项目,但可以删除项目

(9)从Windows环境进入DOS方式后,返回Windows环境的命令为

A)QUITB)WINC)EXITD)ESC

(10)下列叙述中正确的是

A)计算机病毒只感染可执行文件

B)计算机病毒只感染文本文件

C)计算机病毒只能通过软件复制的方式进行传播

D)计算机病毒可以通过读写磁盘或网络等方式进行传播

篇9:华硕嵌入式程序员c语言笔试题目

华硕嵌入式程序员c语言笔试题目

预处理器(preprocessor)

1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)

#define seconds_per_year (60 * 60 * 24 * 365)ul

我在这想看到几件事情:

1) #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)

2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的,

3) 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号l,告诉编译器这个常数是的长整型数。

4) 如果你在你的表达式中用到ul(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。

2 . 写一个“标准”宏min ,这个宏输入两个参数并返回较小的一个。

#define min(a,b) ((a) <= (b) ? (a) : (b))

这个测试是为下面的目的而设的:

1) 标识#define在宏中应用的基本知识。这是很重要的。因为在 嵌入(inline)操作符 变为标准c的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。

2)三重条件操作符的知识。这个操作符存在c语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。

3) 懂得在宏中小心地把参数用括号括起来

4) 我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?

least = min(*p++, b);

3. 预处理器标识#error的目的是什么?

如果你不知道答案,请看参考文献1,

这问题对区分一个正常的伙计和一个书呆子是很有用的`。只有书呆子才会读c语言课本的附录去找出象这种问题的答案。当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。

死循环(infinite loops)

4. 嵌入式系统中经常要用到无限循环,你怎么样用c编写死循环呢?

这个问题用几个解决方案。我首选的方案是:

while(1)

{

}

一些程序员更喜欢如下方案:

for(;;)

{

}

这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的基本原理。如果他们的基本答案是:“我被教着这样做,但从没有想到过为什么。”这会给我留下一个坏印象。

第三个方案是用 goto

loop:

...

goto loop;

应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的basic/fortran程序员。

数据声明(data declarations)

5. 用变量a给出下面的定义

a) 一个整型数(an integer)

b)一个指向整型数的指针( a pointer to an integer)

c)一个指向指针的的指针,它指向的指针是指向一个整型数( a pointer to a pointer to an intege)r

d)一个有10个整型数的数组( an array of 10 integers)

篇10:思科和慧通的c语言笔试面试题

思科

1. 用宏定义写出swap(x,y)

#define swap(x, y)

x = x + y;

y = x - y;

x = x - y;

2.数组a[N],存放了1至N-1个数,其中某个数重复一次,写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:

int do_dup(int a[],int N)

3 一语句实现x是否为2的若干次幂的判断

int i = 512;

cout << boolalpha << ((i & (i - 1)) ? false : true) << endl;

4.unsigned int intvert(unsigned int x,int p,int n)实现对x的进行转换,p为起始转化位,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;

}

慧通:

什么是预编译

何时需要预编译:

1、总是使用不经常改动的大型代码体。

2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。

char * const p;

char const * p

const char *p

上述三个有什么区别?

char * const p; //常量指针,p的值不可以修改

char const * p;//指向常量的指针,指向的常量值不可以改

const char *p; //和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;

结果是:0 0 1 1

解答:str1,str2,str3,str4是数组变量,它们有各自的内存空间;

而str5,str6,str7,str8是指针,它们指向相同的常量区域,

12. 以下代码中的两个sizeof用法有问题吗?[C易]

void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母

{

for( size_t i=0; i< p>

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。

一个32位的机器,该机器的指针是多少位

指针是多少位只要看地址总线的位数就行了。80386以后的机子都是32的数据总线。所以指针的位数就是4个字节了。

main()

{

int a[5]={1,2,3,4,5};

int *ptr=(int *)(&a+1);

printf(“%d,%d”,*(a+1),*(ptr-1));

}

输出:2,5

*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5

&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)

int *ptr=(int *)(&a+1);

则ptr实际是&(a[5]),也就是a+5

原因如下:

&a是数组指针,其类型为 int (*)[5];

而指针加1要根据指针类型加上一定的值,

不同类型的指针+1之后增加的大小不同

a是长度为5的int数组指针,所以要加 5*sizeof(int)

所以ptr实际是a[5]

但是prt与(&a+1)类型是不一样的(这点很重要)

所以prt-1只会减去sizeof(int*)

a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].

1.请问以下代码有什么问题:

int main()

{

char a;

char *str=&a;

strcpy(str,“hello”);

printf(str);

return 0;

}

没有为str分配内存空间,将会发生异常

问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。

char* s=“AAA”;

printf(“%s”,s);

s[0]=“B”;

printf(“%s”,s);

有什么错?

“AAA”是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。

cosnt char* s=“AAA”;

然后又因为是常量,所以对是s[0]的赋值操作是不合法的。

C++笔试题目

C++类型笔试题目

C/C++笔试智力题

C++程序员求职信

C++书籍阅读顺序

C++函数指针详解

c++该如何学习

笔试题目

笔试题库

笔试学习法

《C++笔试(精选10篇).doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

点击下载本文文档