博文
指针做形参(2010-06-07 20:18:00)
摘要:void test(int* p)
{
*p = 2;
p = NULL;
}int main(int argc, char * argv[])
{
int te = 3;
cout<<"te = "<<te<<endl;
int *pTe = &te;
cout<<"*pTe = "<<*pTe <<endl;
cout<<"pTe = "<<pTe <<endl;
test(pTe);
cout<<"After test()\n*pTe = "<<*pTe <<endl;
cout<<"pTe = "<<pTe <<endl;
system("pause");
return 0;
}
输出:
te = 3
*pTe = 3
pTe = 0013FF38
After test()
*pTe = 2
pTe = 0013FF38
Press any key to continue . . .
说明:
函数的形参可以是指针,此时将复制实参指针。与其他非引用类型的形参一样,该类形参的任何改变也仅作用于局部副本。如果函数将新指针赋给形参,主调函数使用的实参指针的值没有改变。
当函数调用的时候,传递给被调用函数一个指针变量p的复制,即原来地址的复制;如果在被调用函数中修改了被指向的对象,即指针所指向的地址处的内容时,由于调用函数中的被复制的指针依然指向这块地址,所以,造成了返回后原指针所指向的对象的值的改变。如果在被调用函数中对指针本身进行任何操作,其实都不会对调用函数中的指针造成任何的修改。......
全局变量、局部变量、静态全局变量、静态局部变量的区别(2010-05-26 13:03:00)
摘要:全局变量、局部变量、静态全局变量、静态局部变量的区别(转)
C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。
从作用域看:
全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。
静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。
局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。
静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。
从分配内存空间看:
全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间
全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
1)、静态变量会被放在程序的静态数据存储区(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区......
c++内存空间分配【转】(2010-05-26 13:02:00)
摘要:
一. 在c中分为这几个存储区
1.栈 - 由编译器自动分配释放
2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放
4.另外还有一个专门放常量的地方。- 程序结束释放
&n......
线程ID 与 线程句柄 区别 (转载)(2010-05-22 14:26:00)
摘要:线程ID 与 线程句柄 区别 (转载)
以下几点是一些总结:
●CreateThread() API 用于创建线程。 API 返回同时线程句柄和线程标识符 (ID)。 线程句柄有完全访问权创建线程对象。 运行线程时线程 ID 唯一标识线程在系统级别。
●ID是在Windows系统范围内唯一标示Thread的。
●Handle是用来操作Thread的,可以有多个,每个HANDLE可以有不同的操作权限,在不同进程OpenThread得到的值不一样。
●线程的ID是系统全局的,其HANDLE是进程局部的.
●此ID只在线程的生存期内有效。
●HANDLE是os和client之间用来操作进程和线程一个桥梁,os有一张维护HANDLE的表单,里面大概放置了 HANDLE的引用计数和有关的属性,HANDLE是os标识进程和线程的东西,但是用户也可以用这个来标识进程和线程,对其操作;而ID是os用来标识进程和线程的,并且是全局唯一的, 但用户可以通过这个ID获得进程线程的HANDLE,多次得到的HANDLE并不一定是一样的.HANDLE是内核对象,而ID好像不是,并没有专门创建ID的函数.
●ID是CreateThread时操作系统自动生成的。
●线程的句柄和id是不同的。
在windows系统中,线程的id是唯一对应的,也就是说,如果两个线程返回相同的id,则他们必然是同一线程,反之一定是不同的线程。而线程的句柄并不是线程的唯一标识,线程的句柄只是用来访问该线程的的一个32位值,尽管相同的句柄一定标识同一线程,但同一线程可能拥有两个打开的句柄,因此,不能用句柄来区分两个线程是否是同一线程。 ......
java中yield(),sleep()以及wait()的区别(2010-05-10 17:38:00)
摘要:
往往混淆了这三个函数的使用。
从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列)。并且在某一时刻cpu只为ready queue中位于队列头部的线程服务。
但是当前正在被服务的线程可能觉得cpu的服务质量不够好,于是提前退出,这就是yield。
或者当前正在被服务的线程需要睡一会,醒来后继续被服务,这就是sleep。
sleep方法不推荐使用,可用wait。
线程退出最好自己实现,在运行状态中一直检验一个状态,如果这个状态为真,就一直运行,如果外界更改了这个状态变量,那么线程就停止运行。
sleep()使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会执行;yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
sleep()可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会;yield()只能使同优先级的线程有执行的机会。
当调用wait()后,线程会释放掉它所占有的“锁标志”,从而使线程所在对象中的其它synchronized数据可被别的线程使用。
waite()和notify()因为会对对象的“锁标志”进行操作,所以它们必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。
彻底明白多线程通信机制:
线程间的通信
1. 线程的几种状态
线程有四种状态,任何一个线程肯定处于这四种状态中的一种:
1) 产生(New):线程对象已经产生,但尚未被启动,所以无法执行。如通过new产生了一个线程对象后没对它调用start()函数之前。
2) 可执行(Runnable):每个支持多线程的系统都有一个排程器,排程器会从线程池中选择一个线程并启动它。当一个线程处于可......
计算机核心期刊排名以及投稿方法(2010-04-21 10:18:00)
摘要:核心期刊: 可以先投计算机应用研究,因为可以免费审稿(3个月),在线,如要发表交1500元
http://www.arocmag.com/ch/index.aspx,
然后可以投给计算机工程(3个月到半年),200元审稿.
保底非核心期刊: 计算机技术与发展(原微型计算机),无审稿费(1个月),发表850元.
以下是转载的核心期刊排名:
自动化、计算机部分
1 计算机学报 北京 中国计算机学会等
2 软件学报 北京 中国科学院软件研究所
3 计算机研究与发展 北京 中国科学院计算技术研究所等
4 自动化学报 北京 中国科学院等
5 计算机科学 重庆 国家科技部西南信息中心
6 控制理论与应用 广州 中国科学院系统科学研究所等
7 计算机辅助设计与图形学学报 北京 中国计算机学会等
8 计算机工程与应用 北京 华北计算技术研究所
9 模式识别与人工智能 北京 &nb......
在Windows下JAVA和ANT的环境变量设置(2010-03-24 15:18:00)
摘要:们来看一下以下设置WinXP及以上用户,右键点击我的电脑->属性->高级->环境变量,设置即可。设置完成后需重新启动命令提示符才能生效。具体如下:
JAVA环境变量设置
Windows下JAVA用到的环境变量主要有3个,JAVA_HOME、CLASSPATH、PATH。
JAVA_HOME指向的是JDK的安装路径,如D:\Program Files\IBM\Java50,在这路径下你应该能够找到bin、lib等目录。
设置方法:
JAVA_HOME = D:\Program Files\IBM\JAVA50
PATH环境变量原来Windows里面就有,只要保留原来的PATH的内容,并在其中加上%JAVA_HOME%\bin (%JAVA_HOME%就是是引用上一步设定好的环境变量JAVA_HOME) 。
设置方法:
PATH = %JAVA_HOME%\bin;%PATH%
同样,%PATH%是引用以前你设置的PATH环境变量,你照抄以前的值就行了。
注意的是最前面的".\;",这个是告诉JDK,搜索CLASS时先查找当前目录的CLASS文件,至于CLASSPATH后面指定tools.jar这个具体文件,是由java语言的import机制和jar机制决定的。
设置方法:
CLASSPATH = .\;%JAVA_HOME%\lib\tools.jar
ANT环境变量设置
Windows下ANT用到的环境变量主要有2个,ANT_HOME 、PATH。
设置ANT_HOME指向ant的安装目录。
设置方法:
ANT_HOME = D:\apache_ant_1.7.0
将%ANT_HOME%\bin; %ANT_HOME%\lib添加到环境变量的path中。
设置方法:
PATH = %ANT_HOME%\bin; %ANT_HOME%\lib
本文来自[Svn中文网]转发请保留本站地址:http://www.svn8.com/java/pz/20080530/705.html......
网络编程(2010-03-23 20:22:00)
摘要:http://www.51chm.org/mfc/class/CAsyncSocket_SendTo.shtml......
work thread和UI thread的区别(包括产生以及终结)(2010-03-23 18:55:00)
摘要:一、线程产生篇:
它们都需要呼叫AfxBeginThread 以产生一个 CWinThread 对象,并在创建对象的时候定义其消息响应函数,下面代码是work thread所呼叫的AfxBeginThread函数:
CWinThread* pThread = AfxBeginThread(ThreadFunc, &Param);
函数原型是:
CWinThread* AFXAPI AfxBeginThread(AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
但如果要产生一个UI thread,你还必须先定义一个 CWinThread 衍生类别,因为现在需要一个消息回路,CWinThread::Run里头就有一个消息回路,然后再呼叫AfxBeginThread产生一个CWinThread对象。下面代码是UI thread所呼叫的AfxBeginThread()函数:
CWinThread *pThread = AfxBeginThread(RUNTIME_CLASS(CMyThread));
函数原型是:
CWinThread* AFXAPI AfxBeginThread(CRuntimeClass* pThreadClass,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
注意:UI thread的消息响应函数原型和work thread的消息响应函数是两个不同的重载函数。
二、线程结束篇
既然 worker thread 的生命就是线程函数本身,函数一旦 return,线程也就结束了,自然得很。或者线程函数也可以呼叫 AfxEndThread,结......
linux及windows下网格模拟器OptorSim2.0的安装方法 【转】(2010-03-16 16:06:00)
摘要:linux及windows下网格模拟器OptorSim2.0的安装方法 【转】
2009-10-29 17:22
OptorSim2.0在linux下的安装:
1、安装 jdk
下载最新版的jdk1.6版本 jdk-1_5_0_08-linux-i586.bin 到 /usr/jdk-1_5_0_08-linux-i586.bin
执行 chmod 777 jdk-1_5_0_08-linux-i586.bin
./jdk-1_5_0_08-linux-i586.bin
运行完毕后,设置环境变量(/etc/profile)
JAVA_HOME=/usr/jdk1.6.0
CLASS_PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASS_PATH
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export JAVA_HOME CLASS_PATH PATH
source /etc/profile
java -version
如果安装成功。系统会显示java version jdk"1.4.1_02"......(不同版本号则显示不同)
2、安装ant
下载 apache-ant-1.6.2-bin.tar.gz 到/usr/apache-ant-1.6.2-bin.tar.gz
执行 tar zxvf apache-ant-1.6.2-bin.tar.gz
配置环境变量(/etc/profile):
ANT_HOME=/usr/apache-ant-1.6.2
CLASS_PATH=$ANT_HOME/lib:$CLASS_PATH
PATH=$ANT_HOME/bin:$PATH
export ANT_HOME CLASS_PATH PATH
source /etc/profile
3、安装 OptorSim 2.0
下载optorsim-2.0.tar.gz 到 /usr/optorsim-2.0.tar.gz
tar zxvf optorsim-2.0.tar.gz
设置环境变量(/etc/profile):
exprot OPTORSIM_HOME=/usr/optorsim-2.......