读书札记《1》

 

 在C++中可以利用0进行各种初始化,下面列举利用0进行初始化的对象。 (1)利用0初始化指针 void *pData=0; (2)利用0初始化数字 float num=0; (3)利用0初始化简单类型的数组 int data[15]={0}; (4)利用0初始化函数指针 void(* fun)()=0;

指针数组比较适用于构造字符串数组。字符串本身就相当于一个字符数组,可以用指向字符串 第一个字符的指针表示,字符串数组是由指向字符串第一个字符的指针组成的数组。

(*p)()表示定义一个指向函数的指针变量,用来存放函数的入口地址。在程序设计的过程中,将一个函数 地址赋给它,它就指向那个函数。函数指针变量赋值可按照如下方式进行书写:、 p=min; m=(*p)(a,b);

规则1:模板成员函数不能是虚函数。 int *fun(int x,int y); //定义字符串数组

解析字符串中的单词。 可以利用一个字符指针来访问每一个字符。如果字符为空格,则表示一个单词结束。

                                 基本知识

服务器:       1.打开一个通信通道并告知本地主机,愿意在某个地址和端口上接收请求。       2.等待客户请求到达该端口。       3.接收到重复服务请求,处理该请求并发送应答信号。接收到并发服务请求, 要激活一个新的进程来处理这个客户请求。新进程处理此客户请求,并不需要对其它 请求作出回应。服务完成后,关闭此新进程与客户的通信链路,并终止。       4.返回第二步,等待另一个客户请求。       5.关闭服务器。

客户端:       1.打开一个通信通道,并连接到服务器所在主机的特定端口。       2.向服务器发送服务请求报文,等待并接收应答;继续提出请求。       3.请求结束后关闭通信通道并终止。

WORD是一种数据类型,通过typedef定义的。 typedef unsigned long DWORD; typedef unsignde short WORD;

htonl,该函数将把一个u_long类型的值从主机字节顺序 转换为TCP/IP网络字节顺序。其原型声明如下所示: u_long htonl(u_long hostlong);

进程的终止 进程在以下情况下终止:   1.调用ExitProcess结束进程;   2.进程的主线程返回,隐含地调用ExitProcee导致进程结束;   3.进程的最后一个县城终止;   4.调用TerminateProcess终止进程。   5.当要结束一个GDI进程时,发送WM_QUIT消息给主窗口,当然也可以从它的任意个线程调用   ExitProcess

线程的终止 以下情况终止一个线程:   1.调用了ExitThread函数;   2.线程函数返回:主线程返回导致ExitProcee被调用,其他线程返回导致ExitThread被调用   3.调用ExitProcess导致进程的所有线程终止;   4.调用TerminateThread终止一个线程;   5.调用TerminateProcess终止一个进程时,导致其所有线程的终止。 当用TerminateProcess或者TerminateThread终止进程或线程时,DLL入口函数DllMain不会执行。

 同步对象 同步对象有:Critical_section(关键段)、 Event(事件)、 Mutex(互斥对象)、 Semaphores(信号量)。


该函数可以使一个线程进入等待状态,直到它所等待的内核对象被触发为止。
 
 
DWORD WatiForSingleObject(
   HANDLE hObject,
   DWORD dwMilliseconds);
 
hObject标识要等待的内核对象。这个对象可以处于触发或未触发状态。如果对象处于未触发状态,主调线程将会一直等待,直到它编程触发状态时为止。如果调用函数时,内核对象已经被触发,那么等待函数直接返回。
第二个参数dwMilliseconds指定主调线程最多愿意花多长时间来等待对象被触发。当指定INFINITE时则告诉系统希望线程永远等待。也可以传入其他值。以微秒为单位。如果在指定的时间内内核对象被触发,则等待函数返回WAIT_OBJECT_0。否则将返回WAIT_TIMEOUT。
(1)、事件对象(Event)。事件对象作为标志在线程间传递信号。一个或多个线程可等待一个事件对象,当指定的事件发生时,事件对象通知等待线程可以开始执行。它有两种类型:自动重置和手动重置事件。
(2)、临界区
(3)、互斥量
(4)、信号量

char 与char*之间的转换要通过char数组进行。通过将char数组指针变量传递给char型 指针来实现类型的转换,代码如下: char buf[5]={'a','b','c','d','e'}; char*p; p=new char[5]; p=buf;

2.atoi、atoI、atof函数将字符串转换为整型、长整型数字。

3.从二维数组的角度来讲,a代表首元素的地址,而这个元素是由3个变量组成的一维数组。 a+1代表第一行的地址,而a[0],a[1]是一维数组,所以a[0]代表一维数组a[0]的首地址, 即&a[0][0],a[1]是&a[1][0]的值 4. #include<iostream> using namespace std;

struct MENU { char *name; void(*func)(); }; //菜单执行的函数 void FileFunc(); void EditFunc(); void ViewFunc(); void ExitFunc(); //菜单操作

MENU menu[]= {  {"文件操作",FileFunc},     {"编辑菜单",EditFunc},     {"视图菜单",ViewFunc},  {"退出菜单",ExitFunc} };

int main() { int sel=0; while(sel>0||sel<5) {  for(int i=0;i<4;i++)  cout<<"("<<i+1<<")"<<menu[i].name<<endl;  cout<<"选择编号执行菜单操作"<<endl;  cin>>sel;  (*menu[sel-1].func)(); }

return 0; }

void FileFunc() {  cout<<"执行文件菜单"<<endl; }

void EditFunc() { cout<<"执行编辑菜单"<<endl; }

void ViewFunc() {  cout<<"执行视图菜单"<<endl; }

void ExitFunc() { cout<<"执行退出菜单"<<endl; }

5.生成小于100的随机数 int random=rand()%100;

void invert(int *x,int n) {  int *p,temp,*i,*j,m=(n-1)/2;  j=x;  j=x+n-1;  p=x+m; for(;i<=p;i++,j--) {   temp=*i;   *i=*j;   *j=temp;  } }

*(p+i)+j表示二维数组第i行第j列的元素地址。*(*(p+i)+j)等价于a[i][j]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2013-04-09 08:48  Alan Perlis  阅读(151)  评论(0编辑  收藏  举报