C语言基础知识
结构体定义及初始化
结构体定义
单独定义:
先定义结构体类型,再定义变量structstudent{intage;stringname;};structstudents1,s2;混合定义定义结构体类型时,同时定义结构变量structstudent{intage;stringname;}s1,s2;其中,ss2是变量无类型名定义struct{intage;stringname;}s1;第一种结构定义的基础上加了关键字typedef,此时我们将structD{intd}看成是一个数据类型typedefstructstudent{intage;stringname;};定义变量可以用:structstudentst1;结构体定义的基础上加上了别名sttypedefstructstudent{intage;stringname;}ST;定义变量可以用:STst1;
结构体指针的定义和使用
结构体指针是指向结构体体的指针,在单独使用结构体指针时需要进行初始化;
利用malloc对结构体指针在堆上进行空间开辟
typedef struct student{
int age;
string name;
} ST;
ST *st1;
st1 = (ST*)malloc(sizeof(ST));
st1->age = 10;
st1->name = "niewei";
free(st1);
利用new关键字对结构体指针进行初始化
typedef struct student{
int age;
string name;
} ST;
ST *st1;
st1 = new ST();
st1->age = 10;
st1->name = "niewei";
delete st1;
const关键字使用方法
const解释及用法
const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。const的用法大致可分为以下几个方面:
const修饰基本数据类型const修饰一般常量及数组constinta=10;等价的书写方式:
int const a=10;
const int arr[3]={1,2,3}; int const arr[3]={1,2,3};
对于类似这些基本数据类型,修饰符const可以用在类型说明符前,也可以用在类型说明符后,其结果是一样的。在使用这些常量的时候,只要不改变这些常量的值便好。
const修饰指针变量*及引用变量&&应当是取址符,是指针符,也就是说,&用于返回变量的实际地址,*用于返回地址所指向的变量,他们应当互为逆运算;**const修饰指针:**
const int* a = & [1] //非常量数据的常量指针 指针常量
int const *a = & [2] //非常量数据的常量指针 a is a pointer to the constant char variable
int* const a = & [3] //常量数据的非常量指针指针常量 常量指针 a is a constant pointer to the (non-constant) char variable
const int* const a = & [4] //常量数据的常量指针
如果const位于星号*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
和的情况相同,都是指针所指向的内容为常量,这种情况下不允许对内容进行更改操作,如不能*a=3;
为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;
为指针本身和指向的内容均为常量。
const应用到函数中1修饰参数的const,如voidfun0;voidfun1;调用函数的时候,用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化,如形参为constA*a,则不能对传递进来的指针的内容进行改变,保护了原指针所指向的内容;如形参为constA&a,则不能对传递进来的引用对象进行改变,保护了原对象的属性。2修饰返回值的const,如constAfun2;constA*fun3;这样声明了返回值后,const按照"修饰原则"进行修饰,起到相应的保护作用。
<1>要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;<2>要避免最一般的赋值操作错误,如将const变量赋值,具体可见思考题;<3>在参数中使用const应该使用引用或指针,而不是一般的对象实例,原因同上;<4>const在成员函数中的三种用法要很好的使用;<5>不要轻易的将函数的返回值类型定为const;<6>除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;
static关键字使用方法
修饰局部变量静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。修饰全局变量普通全局变量对整个工程可见,其他文件可以使用extern``外部声明后直接使用。也就是说其他文件不能再定义一个与其相同名字的变量了。静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。修饰函数在函数的返回类型前加上static,就是静态函数,静态函数只能在声明它的文件中可见,其他文件不能引用该函数;不同的文件可以使用相同名字的静态函数,互不影响;
动态内存分配及管理malloc和newfree和delete的联系与差别
C/C++中程序内存区域划分
内核空间:Linux系统对自身进行了划分,一部分核心软件独立于普通应用程序,运行在较高的特权级别上,它们驻留在被保护的内存空间上,拥有访问硬件设备的所有权限,Linux将此称为内核空间。栈:又叫堆栈,非静态局部变量和函数参数及返回值都在栈上存储,栈是从上往下增长的。内存映射段:是高效的I/O映射方式,用于装载一个共享的动态内存库,用户可以使用系统接口创建共享共享内存,做进程间通信,堆:用于程序运行时动态分配内存,堆是从下往上增长的。数据段:存储静态数据和全局变量。代码段:可执行时的代码和只读常量。
C语言的动态分配内存管理方式
malloc原型:void*malloc;作用:动态开辟byte_size个字节的内存空间,不进行初始化,返回指向此内存的指针,此指针所指数据类型没有确定,需要强转int*p=malloc);动态开辟5*4=20个字节大小的空间,返回空间首地址指针并强转为int*型后赋予指针变量p。注意:malloc只开辟空间,不初始化,即只将此空间由未占用状态变为已占用状态,空间内存储的具体数据未指定改变。函数返回值是空间首地址,上例中赋给了p变量。calloc原型:void*calloc;作用:动态开辟n*type_byte_size个字节,将每个字节均初始化为ascii码0,返回指向此内存的指针,此指针所指数据类型没有确定,需要强转。举例:int*p=calloc);例解:动态开辟5*4=20个字节大小的空间,其中每个字节均赋初值0,返回空间首地址指针并强转为int*型后赋予指针变量p。注意:calloc在malloc的基础上将空间按字节初始化为ascii码0,且其参数有两个,两参数之积为空间总字节数。realloc原型:void*realloc;**作用:**对空间进行调整,若p为空,则该函数与malloc相同;若p所指空间连续大小大于byte_size,则从首地址开始连续地扩充开辟p所指空间至byte_size字节,不对空间再次赋值,将空间地址指针返回;若p所指空间连续大小小于byte_size,则新开辟byte_size字节大小的空间,将p指向的空间内的数据复制进新空间,之后释放p所指空间,返回指向新空间的指针,此指针所指数据类型没有确定,需要强转。
int *p=(int *)calloc(5,sizeof(int));
p =(int*)realloc(p,10*sizeof(int));
例解:首句中p为54=20字节的空间指针并按字节初始化为ascii码0,强转后才限定了指向空间的每个元素为int型。后句将p所指空间扩充为10*4=40字节的空间指针,未对其二次赋值,故此时p[0]-p为0,p~p未初始化。
freeC库函数voidfree释放之前调用calloc、malloc或realloc所分配的内存空间。ptr--指针指向一个要释放内存的内存块,该内存块之前是通过调用malloc、calloc或realloc进行分配内存的。如果传递的参数是一个空指针,则不会执行任何动作。该函数不返回任何值。new//申请单个Test类型的对象Test*p1=newTest;deletep1;//申请10个Test类型的对象Test*p2=newTest;delete[]p2;
malloc和new的差异
malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地方是:
malloc和free是函数,new和delete是操作符malloc申请的空间不会初始化,new可以初始化malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可malloc的返回值为void,在使用时必须强转,new不需要,因为new后跟的是空间的类型malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理new/delete比malloc和free的效率稍微低点,因为new/delete的底层封装了malloc/free
文章为作者独立观点,不代表股票交易接口观点