复试准备C程序设计2

目录

1.c和c++ 中的struct有什么不同?

2.数组和链表的区别

3.数组的概念

4.静态、动态、全局内存

5.指针

6.预编译?

7.static的关键作用

 8.const关键字的作用

9.volatile关键字

10.extern关键字

11.sizeof关键字

12.结构体位域

13.函数参数入栈的顺序

14.inline内联函数

15.malloc/free和new/delete的区别

16.malloc(0)的返回值

17.system("pause")?

18.C++中的类和C中的struct有什么区别?

19.内存分配方式有几种?

20.头文件的作用

21.sprintf和printf的区别

 22.C语言和C++的区别?


1.c和c++ 中的struct有什么不同?

c中的struct不可以含有成员函数,而c++ 中的struct可以。

c++ 中struct和class的主要区别在于默认的存取权限不同,

struct默认为public ,而class默认为private

2.数组和链表的区别

数组:数据顺序存储,固定大小;

链表:数据可以随机存储,大小可动态改变

3.数组的概念

数组:由一系列具有相同数据类型组成的集合

  • 数组在初始化的时候,采用大括号的形式进行赋值,并且只有在初始化的时候才能采用大括号的形式对其进行整体赋值。
  • 如果数组只定义,不赋值,则数组元素的值为随机值
  • 数组的初始化形式分为两种,一种为完全初始化,数组中所有的元素都有值,
    另外一种初始化方式是数组进行部分初始化,系统默认从第一个元素开始赋值,未被初始化的元素赋值为0
  • 数组与数组之间不能进行整体赋值,要通过数组元素与元素之间进行赋值
  • 如果对数组进行初始化,数组的长度省略,则系统按照数组中初始化的元素的数据进行分配 int a[]= {1,2,3}

4.静态、动态、全局内存

(1)静态声明的变量分配在这里,全局变量也使用这部分内存。这些变量在程序开始运行时分配,直到程序终止才消失。所有函数都能访问全局变量,静态变量的作用域则局限在定义它们的函数内部。

(2)自动内存的变量在函数内部声明,并且在函数被调用时才创建。它们的作用域局限于函数内部,而且生命周期限制在函数的执行时间内

(3)动态内存分配在堆上,可以根据需要释放,而且直到释放才消失。指针引用分配的内存,作用域局限于引用内存的指针

5.指针

(1)指针变量包含内存中别的变量、对象或函数的地址。对象就是内存分配函数(比如malloc)分配的内存。

指针通常根据所指的数据类型来声明。对象可以是任何C数据类型,如整数、字符、字符串或结构体。然而,指针本身并没有包含所引用数据的类型信息,指针只包含地址。

(2)精通指针的好处

 写出快速高效的代码;
 为解决很多类问题提供方便的途径;
 支持动态内存分配;
 使表达式变得紧凑和简洁;
 提供用指针传递数据结构的能力而不会带来庞大的开销;
 保护作为参数传递给函数的数据

补充【引用】 :

 引用的一些规则如下:

  • 引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
  • 不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
  • 一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
  • 引用的创建和销毁并不会调用类的拷贝构造函数
  • 在语言层面,引用的用法和对象一样;在二进制层面,引用一般都是通过指针来实现的,只不过编译器帮我们完成了转换.

总的来说:引用既具有指针的效率,又具有变量使用的方便性和直观性.

Q如何决定在什么时候使用指针,在什么时候使用引用呢?
首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。
PS:引用在定义时不可加const,否则编译出错,在形参前面则可以加const以确保在函数中该变量不会被修改。
不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。

6.预编译?

(1)编译又称预处理,是整个编译过程最先做的工作,即程序执行前的一些预处理工作。主要处理#开头的指令。如拷贝#include包含的文件代码、替换#define定义的宏、条件编译#if等。.

(2)何时需要预编译

  • 总是使用不经常改动的大型代码体。
  • 程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。

 (3)#和##的区别

#是把宏参数转化为字符串的运算符,##是把两个宏参数连接的运算符。

7.static的关键作用

注:static修饰局部变量会改变局部变量的生命周期,将他的生命周期变为整个进程,且只会定义一次

修饰全局变量,会改变函数的可见性,即使在外部文件使用extern声明以后,仍然无法调用,仅在当前文件调用,也就是该变量的可见性缩小到当前文件。static全局变量只初始化一次,防止在其他文件单元中被引用。static修饰函数的作用和修饰全局变量类似。

 8.const关键字的作用

(1)声明常变量,使指定的变量不能修改

(2)修饰函数形参,使得形参在函数内不能被修改,表示输入参数

(3)修饰函数返回值,使得函数的返回值不能被修改

附:const和#define的比较

const有数据类型,#define没有数据类型

个别编译器中const可以进行调试,#define不可以进行调试

在类中定义常量有两种方式

1、  在类在声明常量,但不赋值,在构造函数初始化表中进行赋值;

2、  用枚举代替const常量。

9.volatile关键字

volatile指定的关键字可能被系统、硬件、进程/线程改变,强制编译器每次从内存中取得该变量的值,而不是从被优化后的寄存器中读取。例子:硬件时钟;多线程中被多个任务共享的变量等。

10.extern关键字

①用于修饰变量或函数,表明该变量或函数都是在别的文件中定义的,提示编译器在其他文件中寻找定义;

②extern “c”的作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的编译方式进行编译,而不是C++的;

11.sizeof关键字

sizeof是在编译阶段处理,且不能被编译为机器码。sizeof的结果等于对象或类型所占的内存字节数。

12.结构体位域

位域是一个或多个位的字段,不同长度的字段(如声明为unsigned int类型)存储于一个或多个其所声明类型的变量中(如整型变量中)。

位域的类型:可以是char、short、int,多数使用int,使用时最好带上signed或unsigned

位域的特点:字段可以不命名,如unsignedint :1;可用来填充;unsigned int :0; 0宽度用来强制在下一个整型(因此处是unsigned int类型)边界上对齐。

13.函数参数入栈的顺序

C语言函数参数入栈顺序是从右向左的,这是由编译器决定的,更具体的说是函数调用约定决定了参数的入栈顺序

14.inline内联函数

inline关键字仅仅是建议编译器做内联展开处理,即是将函数直接嵌入调用程序的主体,省去了调用/返回指令

15.malloc/free和new/delete的区别

16.malloc(0)的返回值

如果请求的长度为0,则标准C语言函数malloc返回一个null指针或不能用于访问对象的非null指针,该指针能被free安全使用

17.system("pause")?

系统的暂停程序,按任意键继续,屏幕会打印,"按任意键继续。。。。。"省去了使用getchar();

18.C++中的类和C中的struct有什么区别?

c++中的类具有成员保护功能,并且具有继承,多态这类oo特点,而c里的struct没有。c里面的struct没有成员函数,不能继承,派生等等.

19.内存分配方式有几种?

  • 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。
  • 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
  • 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

20.头文件的作用

加强安全监测;通过头文件可以方便调用库函数,而不必关心其他方式

21.sprintf和printf的区别

printf函数打印结果到屏幕上,而sprintf函数可以完成其他数据类型转换为字符串。
从以下几点来说明一下
(1)函数的中前两个参数是固定外,可选参数是任意个,buffer是存放字符串指针或者数组名字,fromat是格式化字符串,只要是printf使用的格式化字符串,在sprintf都可以使用,格式化字符串是该函数的精髓。
(2)首先可以把一个整型数据格式化为字符串。
(3)浮点类型,可以控制精度
(4)连接两个字符串,也可以将多个字符串连接起来

sprintf的返回值就是字符串的字符的个数,也就是strlen(str)的结果,
也可以打印某个参数的地址

 22.C语言和C++的区别?

  • 全新的程序程序思维,C语言是面向过程的,而C++是面向对象的。
  • C语言有标准的函数库,它们松散的,只是把功能相同的函数放在一个头文件中;而C++对于大多数的函数都是有集成的很紧密,特别是C语言中没有的C++中的API是对Window系统的大多数API有机的组合,是一个集体。但你也可能单独调用API。
  • 特别是C++中的图形处理,它和C语言的图形有很大的区别。C语言中的图形处理函数基本上是不能用在中C++中的。C语言标准中不包括图形处理。
  • C和C++中都有结构的概念,但是在C语言中结构只有成员变量,而没成员方法,而在C++中结构中,它可以有自己的成员变量和成员函数。但是在C语言中结构的成员是公共的,什么想访问它的都可以访问;而在VC++中它没有加限定符的为私有的。
  • C语言可以写很多方面的程序,但是C++可以写得更多更好,C++可以写基于DOSr程序,写DLL,写控件,写系统。
  • C语言对程序的文件的组织是松散的,几乎是全要程序处理;而C++对文件的组织是以工程,各文件分类明确。

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值