一、个经过编译的C/C++的程序占用的内存分成以下几个部分:
1、栈区(stack):由编译器自动分配和释放 ,存放函数的参数值、局部变量的值等,甚至函数的调用过程都是用栈来完成。其操作方式类似于数据结构中的栈。
2、堆区(heap) :一般由程序员手动申请以及释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式类似于链表。
3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放空间。
4、文字常量区:常量字符串就是放在这里的。 程序结束后由系统释放空间。
5、程序代码区:存放函数体的二进制代码。
下面的例子可以完全展示不同的变量所占的内存区域:
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; //栈中
char s[] = "abc"; //栈中
char *p2; //栈中
char ......
一、个经过编译的C/C++的程序占用的内存分成以下几个部分:
1、栈区(stack):由编译器自动分配和释放 ,存放函数的参数值、局部变量的值等,甚至函数的调用过程都是用栈来完成。其操作方式类似于数据结构中的栈。
2、堆区(heap) :一般由程序员手动申请以及释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式类似于链表。
3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放空间。
4、文字常量区:常量字符串就是放在这里的。 程序结束后由系统释放空间。
5、程序代码区:存放函数体的二进制代码。
下面的例子可以完全展示不同的变量所占的内存区域:
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; //栈中
char s[] = "abc"; //栈中
char *p2; //栈中
char ......
C变量的存储方式-“静态存储”和“动态存储” 变量的存储方式可分为“静态存储”和“动态存储”两种。 静态存储变量通常是在变量定义时就分定存储单元并一直保持不变,直至整个程序结束。全局变量即属于此类存储方式。动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放。典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配,调用函数完毕立即释放。如果一个函数被多次调用,则反复地分配、释放形参变量的存储单元。从以上分析可知,静态存储变量是一直存在的,而动态存储变量则时而存在时而消失。我们又把这种由于变量存储方式不同而产生的特性称变量的生存期。生存期表示了变量存在的时间。生存期和作用域是从时间和空间这两个不同的角度来描述变量的特性,这两者既有联系,又有区别。一个变量究竟属于哪一种存储方式,并不能仅从其作用域来判断,还应有明确的存储类型说明。 在C语言中,对变量的存储类型说明有以下四种: auto 自动变量 register 寄存器变量 extern 外部变量(全局变量) static & ......
将类成员函数用做C回调函数
提出问题:
回调函数是基于C编程的Windows SDK的技术,不是针对C++的,程序员可以将一个C函数直接作为回调函数,但是如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。
分析原因:
普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递一个指向自身的指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数但是确有不同的数据成员。由于this指针的作用,使得将一个CALLBACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败。
解决方案:
一,不使用成员函数,直接使用普通C函数,为了实现在C函数中可以访问类的成员变量,可以使用友元操作符(friend),在C++中将该C函数说明为类的友元即可。这种处理机制与普通的C编程中使用回调函数一样。
二,使用静态成员函数,静态成员函数不使用this指针作为隐含参数,这样就可以作为回调函数了。静态成员函数具有两大特点:其一,可以在没有 ......
N 当用两个补码表示的带符号数进行运算时,N=1表示运算的结果为负数;N=0表示运算的结果为正数或零.
Z Z=1表示运算的结果为零,Z=0表示运算的结果非零。
C 可以有4种方法设置C的值:
加法运算(包括CMN):当运算结果产生了进位时(无符号数溢出),C=1,否则C=0。
减法运算(包括CMP):当运算时产生了借位时(无符号数溢出),C=0,否则C=1。
对于包含移位操作的非加/减运算指令,C为移出值的最后一位。
对于其它的非加/减运算指令,C的值通常不会改变。
V 可以有2种方法设置V的值:
对于加减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出
对于其它的非加/减运算指令,V的值通常不会改变。
0000 = EQ - Z set (equal,相等)
0001 = NE - Z clear (not equal,不相等)
0010 = CS - C set (unsigned higher or same,无符号大于或等于)
0011 = CC - C clear (unsigned lower,无符号小于)
0100 = MI - N set (negative,负数)
0101 = PL - N clear (positive or zero,正数或零)
0110 = VS - V set (overflow,溢出)
0111 = VC - V clear (no overflow,未溢出)
1000 = HI - C set and Z clear (unsigned higher,无符 ......
@ ECHO OFF
@ ECHO.
@ ECHO. 说 明
@ ECHO --------------------------------------------------------------------------
@ ECHO NTFS是一种磁盘格式。该格式能存放大于4G的单个文件(如高清电影文件),并可对
@ ECHO 文件夹进行加密,但有个缺点是DOS下无法访问。建议D盘及其后的盘使用NTFS格式,
@ ECHO C盘如非必要可以不转换,FAT32与NTFS这两种格式的读写速度几乎是没有差别的。
@ ECHO --------------------------------------------------------------------------
@ ECHO.
convert c:/fs:ntfs ......
#include <iostream.h>
void fun0(int* p)
{
int* a=new int[3];
*a=0;
*(a+1)=1;
*(a+2)=2;
p=a;
}
void fun1(int* &p)
{
int* a=new int[3];
*a=0;
*(a+1)=1;
*(a+2)=2;
p=a;
}
void fun2(int* p)
{
*p=0;
*(p+1)=1;
*(p+2)=2;
}
//warning:returning address of local variable or temporary
int* fun3()
{
int a[]={1,2,3};
return a;
}
//warning C4172: returning address of local variable or temporary
int*& fun4()
{
int* a=new int[3];
a[0]=0;
a[1]=1;
a[2]=2;
return a;
}
void fun5(int* p[3])
{
*p[0]=0; *(p[0]+1)=10;
*p[1]=1; *(p[1]+1)=11;
*p[2]=2; *(p[2]+1)=12;
}
//cannot convert from 'int [3]' to 'int *&
/*
int*& fun6()
{
int a[]={1,2,3};
return a;
}
*/
void main()
{
int* p=new int[3];
// int* p; //runtime error:the memory connot be written
//it is necessory to allocate memory
cout<<"test: void fun0(int* p)"<<endl;
fun0(p);
for(int i=0;i<3;i++){
cout<<*(p+i)<<en ......