c语言中volatile关键字是什么含义
最佳答案 volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。
例如:
volatile int i=10;
int j = i;
...
int k = i;
volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。
而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问,不会出错。
1. 请问TCP/IP协议分为哪几层?FTP协议在哪一层?
答:
TCP/IP整体构架概述
OSI的七层参考模型:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为:
应用层:应用程序间沟通的层,如简单传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。
传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。
网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据
2\已知strcpy 函数的原型是char *strcpy(char *strDest, const char *strSrc);其中strDest 是目
的字符串,strSrc 是源字符串。(1)不调用C++/C 的字符串库函数,请编写函数 strcpy(2)strcpy 能把strSrc 的内容复制到strDest,为什么还要char * 类型的返回值?
#include <stdio.h>
#include <string.h>
char* StrCpy(char *strDest, const char *strSrc)
{
if(!strDest||!strSrc)
return NULL;
if (!strlen(strSrc))
{
*strDest='\0';
return strDest;
}
char* tmp=strDest;
do
{
*tmp++=*strSrc;
} while (*strSrc++);
return strDest;
}
int main()
{
char str1[20],str2[20];
scanf("%s",str2);
printf("%s\n",StrCpy(str1,str2));//这一行就说明了返回char*的作用
return 0;
}
2. C语言中static函数与普通函数的区别是什么?
答:1.static有什么用途?(请至少说明两种)
1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用
1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。 static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用; static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
telnet在Tcp/Ip协议中是什么意思 ?
Telnet协议是c语言和c++区别TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法SNMP的基本功能是:取得,设置和接收代理发送的意外信息。取得指的是发送请求,代理根据这个请求回送相应的数据,设置是设置管理对象(也就是代理)的值,接收收代理发送的意外信息是指代理可以在未请求的状态下向报告发生的意外情况。
同步方式Mutex和Cirtical Section的区别
Event分自动和手动两种,手动Event得到信号时,所有等待该事件的线程都将进入可调度状态,自动Event得到信号时,只有一个等待该事件的线程进入可调度状态。
Mutex每次只有一个线程得到信号,Mutex的内部维护一个线程id,用于标识系统中的哪个线程当前拥有该Mutex对象,与其他的内和对象不同即使Mutex处于没有信号的状态,只要该线程的ID与Mutex维护的ID相同,该线程就可以保持可调度状态。
Semaphore不同于其他内核对象的的地方是他有一个可用资源计数的功能。
Critical Section不同于前面所提到的三种,他们都是内核对象,是在内核方式下实现同步的,而Critical Section则是在用户方式下实现的同步的,效率比前面的三种都要高;另外Critical Section是不能跨进程使用的。
3、
事件(Event)是WIN32提供的最灵活的线程间的同步方式,事件可处于激发状态或未激发状态。根据状态变迁方式的不同,事件分为手动设置和自动恢复两类。
互斥量(Mutex)跟临界区很相似,只有拥有胡扯对象的线程才具有访问资源的权限。互斥量又比临界区复杂,运行速度也比较慢,因为使用互斥量不仅能够在同一个应用程序不
Mutex每次只有一个线程得到信号,Mutex的内部维护一个线程id,用于标识系统中的哪个线程当前拥有该Mutex对象,与其他的内和对象不同即使Mutex处于没有信号的状态,只要该线程的ID与Mutex维护的ID相同,该线程就可以保持可调度状态。
Semaphore不同于其他内核对象的的地方是他有一个可用资源计数的功能。
Critical Section不同于前面所提到的三种,他们都是内核对象,是在内核方式下实现同步的,而Critical Section则是在用户方式下实现的同步的,效率比前面的三种都要高;另外Critical Section是不能跨进程使用的。
3、
事件(Event)是WIN32提供的最灵活的线程间的同步方式,事件可处于激发状态或未激发状态。根据状态变迁方式的不同,事件分为手动设置和自动恢复两类。
互斥量(Mutex)跟临界区很相似,只有拥有胡扯对象的线程才具有访问资源的权限。互斥量又比临界区复杂,运行速度也比较慢,因为使用互斥量不仅能够在同一个应用程序不
同线程中实现资源的安全共享,还可以在不同应用程序的线程间实现对资源的安全共享。
信号量(Senmaphores)对象对线程的同步方式与前面几种方法不同,信号量允许多个线程同时使用共享资源。信号量的值我们可以认为是可以同时访问贡献资源的线程最大数目,或者可以理解为可以共享使用的某一类资源的数目。
临界区(CriticalSection)在任意时刻只允许一个线程对共享资源进行访问。临界区不是OS核心对象,如果进入理解去的线程“挂”了,将无法释放临界资源,这个缺点在互斥量中得到了弥补,因为使用互斥量可以设置超时值。
信号量(Senmaphores)对象对线程的同步方式与前面几种方法不同,信号量允许多个线程同时使用共享资源。信号量的值我们可以认为是可以同时访问贡献资源的线程最大数目,或者可以理解为可以共享使用的某一类资源的数目。
临界区(CriticalSection)在任意时刻只允许一个线程对共享资源进行访问。临界区不是OS核心对象,如果进入理解去的线程“挂”了,将无法释放临界资源,这个缺点在互斥量中得到了弥补,因为使用互斥量可以设置超时值。
静态-全局静态函数(或变量)和类的静态成员函数(或变量)
Static关键字
用来声明静态函数或者静态变量。
静态函数:用static声明的函数是静态函数。静态函数可以分为全局静态函数和类的静态成员函数。
静态变量:用static声明的变量是静态变量。静态变量可以分为全局静态变量和类的静态成
员变量。
在类中,用static声明的变量为类的静态成员变量,它为该类的公用变量,对于该类的所有对象来说,static成员变量只有一份。在类中,用static声明的函数是类的静态成员函数,在调用该函数时,不会将对象的引用(this 指针)传递给它,所以在静态函数中不可访问非静态的成员函数或者非静态的成员变量(访问非静态数据成员,必须通过参数传递方式得到对象名,然后通过对象名来访问。)。可以通过对象引用或类名(不需要实例化)访问静态成员函数或者静态成员变量。静态类成员的特性就是属于类而不专属于某一个对象。
类中的任何成员函数都可以访问静态成员,但静态成员函数只能通过对象名(或指向对象的指针)访问该对象的非静态成员,因为静态成员函数没有this 指针。---所以构造函数不可以定义为static(构造函数中要初始化普通成员变量和构造对象)。
在类中,用static声明的变量为类的静态成员变量,它为该类的公用变量,对于该类的所有对象来说,static成员变量只有一份。在类中,用static声明的函数是类的静态成员函数,在调用该函数时,不会将对象的引用(this 指针)传递给它,所以在静态函数中不可访问非静态的成员函数或者非静态的成员变量(访问非静态数据成员,必须通过参数传递方式得到对象名,然后通过对象名来访问。)。可以通过对象引用或类名(不需要实例化)访问静态成员函数或者静态成员变量。静态类成员的特性就是属于类而不专属于某一个对象。
类中的任何成员函数都可以访问静态成员,但静态成员函数只能通过对象名(或指向对象的指针)访问该对象的非静态成员,因为静态成员函数没有this 指针。---所以构造函数不可以定义为static(构造函数中要初始化普通成员变量和构造对象)。
C|C 中的静态全局变量,静态局部变量,全局变量,局部变量的区别C|C++中的静态全局变量,静态局部变量,全局变量,局部变量的区别。从分配内存空间看: 全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间 全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
C 语言中什么是“句柄”和“指针”
所谓句柄实际上是一个数据,是一个Long (整长型)的数据。
句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,,句柄是一个标识符,是拿来标识对象或者项目的,句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。
为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。
telnet在Tcp/Ip协议中是什么意思
Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。
它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序
,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,
就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,
必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法
SNMP的基本功能是:取得,设置和接收代理发送的意外信息。取得指的是发送请求,代理根据这个请求回送相应的数据,设置是设置管理对象(也就是代理)的值,接收收代理发送的意外信息是指代理可以在未请求的状态下向报告发生的意外情况。
内存中堆(heap)和栈(stack)的区别(非数据结构中的堆和栈)
在进行C/C++编程时,需要程序员对内存的了解比较精准。经常需要操作的内存可分为以下几个类别:
2、 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论