本文主要是介绍ACLGUI IN SSTC(PIA)2020中可能遇到的一些知识点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- (一)条件编译
- (二)部分头文件
- (三)空指针
- 具体操作示例
- 常见问题1:空指针指向了内存的什么地方?
- 常见问题2: 在实际的操作中,如何判断某个指针是不是空指针?
- 常见问题3:可以定义自己的 NULL 的实现吗?
- (四)new,delete与指针
- new创建对象
- delete销毁对象
- (五)ACLLIB中部分函数的使用(未完成)
- (六)template(未完成)
- (七)作用域与extern(未完成)
- 局部作用域
- 全局作用域
- extern关键字
- (八)简单的文件操作(未完成)
(一)条件编译
一般情况下,C语言源程序中的每一行代码.都要参加编译。但有时候出于对程序代码优化的考虑.希望只对其中一部分内容进行编译.此时就需要在程序中加上条件,让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃,这就是条件编译(conditional compile)。
1.if格式
#if 表达式语句序列①
[#else语句序列②]
#endif
功能:当表达式的值为真时,编译语句序列①,否则编译语句序列②。其中,#else和语句序列②可有可无。
2.ifdef格式
#ifdef 标识符语句序列①
[#else语句序列②]
#endif
功能:当标识符已被定义时(用#define定义),编译语句序列①,否则编译语句序列②。其中#else和语句序列②可有可无。
3.ifndef格式
#ifndef 标识符语句序列①
[#else语句序列②]
#endif
功能:该格式功能与ifdef相反。
4.补充内容
#undef
作用:在后面取消以前定义的宏定义。
示例1:
#include <iostream.h>
#include<string.h>
#define MAX 5
#undef MAX
void main()
{char name[MAX]="abcd"; //最多四个字符,否则会提示说超出长度,原因是由于字符串末尾有'\0'字符cout<<"MAX = "<<MAX<<endl;for(int i=0;i<MAX;i++)cout<<name<<" "<<endl;
}
我们定义了MAX但又将其取消,会得到“未定义符号MAX”的错误提示。
示例2:
#include <stdio.h>
int main( void )
{
#define MAX 200printf("MAX= %d\n",MAX);
#undef MAX
#define MAX 300printf("MAX= %d\n",MAX);return 0;
}
我们可以像这样修改已经宏定义的符号常量的值。
示例3:
#define TEST_A 1
#define TEST_CLASS_A clase T1
#include "TEST.h"
#undef TEST_A
#undef TEST_CLASS_A
此段代码中,在头文件TEST.h中,这两个宏定义语句起作用,该头文件之后,它们就会释放掉。
(二)部分头文件
1.windows.h
Windows.h头文件封装了许多库函数以及一些类,将一些复杂的工作由库函数处 理,Windows.h头文件中包含了Windef.h、Winnt.h、Winbase.h、Winuser.h、Wingdi.h等头文件,涉及到了Windows内核API,图形界面接口,图形设备函数等重要的功能。
其中常用的函数包括休眠函数sleep(),清屏函数system(“cls”)等。
2.commctrl.h
一个包含大量接口的windows控件
具体内容参考commctrl.h
注:commctrl.h不能单独使用,在引入该头文件时,我们应该先加上#include<windows.h>
3.sstream
sstream,即字符串流,通常是用来做数据转换的。比如
int n=10000;
char s[10];
sprintf(s,”%d”,n);// s中的内容为“10000”
详情可以参考sstream
4.ctime
见官网文献cmath
(三)空指针
空指针是一个被赋值为0的指针,在没有被具体初始化之前,其值为0。由系统保证空指针不指向任何实际的对象或者函数。同时,任何对象或者函数的地址都不可能是空指针。
具体操作示例
#define NULL 0
char *p = NULL;
注:先把要赋值的变量的地址赋给空指针,然后才能把变量的值赋给该指针。
常见问题1:空指针指向了内存的什么地方?
标准并没有对空指针指向内存中的什么地方这一个问题作出规定,也就是说用哪个具体的地址值表示空指针取决于系统的实现。我们常见的空指针一般指向 0 地址,即空指针的内部用全 0 来表示;也有一些系统用一些特殊的地址值或者特殊的方式表示空指针。
在实际编程中不需要了解在我们的系统上空指针到底是一个 zero null pointer 还是 nonzero null pointer,我们只需要了解一个指针是否是空指针就可以了——编译器会自动实现其中的转换,为我们屏蔽其中的实现细节。注意:不要把空指针的内部表示等同于整数 0 的对象表示,有时它们是不同的。
常见问题2: 在实际的操作中,如何判断某个指针是不是空指针?
可以通过与空指针常量或者其它的空指针的比较来实现(注意与空指针的内部表示无关)。
如果 p 是一个指针变量,
若进行: p = 0;、p = 0L;、p = ‘\0’;、p = 3 - 3;、p = 0 * 17; 中的任何一种赋值操作之后(对于 C 来说还可以是 p = (void*)0;),p 都成为一个空指针,并且由系统保证空指针不指向任何实际的对象或者函数。 反过来说,任何对象或者函数的地址都不可能是空指针。
指针变量 p 是空指针的判断:(假设 p 是一个指针变量,q 是一个同类型的空指针,要检查 p 是否是一个空指针)
if ( p == 0 )
if ( p == ‘\0’ )
if ( p == 3 - 3 )
if ( p == NULL ) /* 使用 NULL 必须包含相应的标准库的头文件 */
if ( NULL == p )
if ( !p )
if ( p == q )
常见问题3:可以定义自己的 NULL 的实现吗?
NULL 是标准库中的一个保留标识符。所以,如果包含了相应的标准头文件而引入了 NULL 的话,则再在程序中重新定义 NULL 为不同的内容是非法的,其行为是未定义的。
(四)new,delete与指针
在C++中,如果定义了对象,在内存中给它分配了空间;如果使用完以后,忘了销毁对象,即无法释放它所占用的内存空间。则这些内存空间一直被占用,直到重启计算机才可释放,这样就造成了内存泄露。
new创建对象
new操作符相当于一个函数,在内存分配完空间后,返回这个空间的首地址。
void main()
{ Point *p1=new Point(1,1);Point *p2=new Point(2,2);
}
delete销毁对象
用new命令可以为对象在内存中动态分配一定的空间,并返回分配空间的首地址;如果在程序运行结束之前没有用delete来销毁这些对象,释放它们所占用的空间也会发生内存泄露。
void main()
{Point *p1=new Point(1,1);Point *p2=new Point(2,2);delete p1;
}
指针p1所指向的对象因为调用了delete,则调用了析构函数,而销毁了对象;而指针p2指向的对象只是调用了new,而没有调用delete,没有被销毁,则发生了内存泄露。
因此,用new创建的对象都应当在程序内及时销毁。
(五)ACLLIB中部分函数的使用(未完成)
ACLLIB
(六)template(未完成)
函数模板定义一族函数。它声明一个通用的类模板,使之可以有一个或多个虚拟的类型参数。
函数模板的格式:
template< class T>(此处的T也可以用别的标识符替代)
prototype
函数模板在形式上分为两部分:模板、函数。在函数前面加上 template< class T>就成为函数模板,因此对函数的各种修饰(inline、constexpr 等)需要加在prototype上,而不是 template 前。
(七)作用域与extern(未完成)
局部作用域
全局作用域
对于对象而言(其他也是一样的),在main函数中,对象的作用域为他所在的最近的一对花括号内。在后花括号处析构函数被调用;全局的对象的作用域为声明之后的整个文件,析构函数在最后被调用。另外,临时产生的对象在使用完后立即会被析构。
extern关键字
extern
(八)简单的文件操作(未完成)
这篇关于ACLGUI IN SSTC(PIA)2020中可能遇到的一些知识点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!