- c++基本的数据类型 ?
- int在32位占多少?
- 变量声明和定义,内存分配时有啥区别?
- C的内存分配策略
- 局部变量全局变量可以重名吗,如何在局部使用全局变量
目录
一、c++基本的数据类型
1.1 基本类型
相关知识:https://www.runoob.com/cplusplus/cpp-data-types.html
int,char,float,double,void,bool,wchar_t
前面加上修饰,
- signed
- unsigned
- short
- long
枚举类型,只能在枚举里面修饰。
虽然bool只有一个bit,但是输出sizeof(bool)的话,会输出1
1.2 变量声明与定义区别
https://blog.csdn.net/u010063827/article/details/78280854
定义:给变量分配存储空间,也可初始值,只能有一次。
int a=5;char p;等等,都是声明+定义。
声明:告诉编译器变量的类型,名字,或者函数的特征(返回值 参数类型 个数)
只有extern表示声明,例如extern int a;告诉编译器,函数的定义在程序外部,变量名称为a,变量类型为int
二、c++内存分配策略
数据结构中的堆,栈,与操作系统中的堆栈是两个不同的概念。
2.1 数据结构中
堆,栈常分开说,且表示两种不同的数据结构。
堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。完全二叉树。
栈,是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,
2.2 操作系统中
https://blog.csdn.net/myqq1418/article/details/81584761
1、栈区(stack) 一级缓存, 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) 二级缓存一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表
3、全局区(静态区)(static),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区,常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区,存放函数体的二进制代码。
从低地址到高地址分别为:代码段、(初始化)数据段、(未初始化)数据段(BSS)、堆、栈、命令行参数和环境变量
动态数据区一般就是“堆栈”。“栈(stack)”和“堆(heap)”是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”,所以每个线程虽然代码一样,但本地变量的数据都是互不干扰。一个堆栈可以通过“基地址”和“栈顶”地址来描述。全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。
├———————┤低端内存区域
│ …… │
├———————┤
│ 动态数据区 │
├———————┤
│ …… │
├———————┤
│ 代码区 │
├———————┤
│ 静态数据区 │
├———————┤
│ …… │
├———————┤高端内存区域
2.3 举例
//main.cpp 程序代码区
int a = 0; //全局初始化区
char *p1; //全局未初始化区
main()
{
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456\0在常量区,p3在栈上。
static int c = 0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
三、全局变量
局部变量可否与全局变量重名?
如何引用一个已经定义过的全局变量?
全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
3.1 局部与全局
局部变量与全局变量重名的话,局部变量会屏蔽全局变量。如果此时还想用全局变量的话,需要加域解析 ::
//main.cpp 程序代码区
int k = 11;
int main(){
bool v_bool = true;
cout << sizeof(bool) << endl;
int a = 0; //全局初始化区
char *p1; //全局未初始化区
{
int i = 2, j = 3, k;
k = i + j;//外部变量已经赋值, 对以下内部变量中不起作用
{
int k = 8;//局部变量, 在内部, 和外部的函数并不起冲突
printf("%d\n", k);//方括号内的代码块的局部变量
printf("%d\n", ::k);//加了::修饰,就是全局变量
}
printf("%d\n", k);//方括号外的局部变量
}
int end; cin >> end;
return 0;
}
如上代码,中间代码块中,局部变量k屏蔽了全局变量k。输出,8,11,5如果想输出全局变量,则需要在写为 ::k,此时输出的是全局变量的值。
3.2 全局变量的引用
同一个头文件中,直接在变量名前加::即可。如果在其他文件中,需要在本文件中加extern修饰进行声明,表示这个全局变量的定义在其他文件之中。
全局变量如果想被多个文件引用,则需要加static修饰,表示只有一个文件中对这个变量初始化一次。
关于static详见:https://blog.csdn.net/weixin_36474809/article/details/100535653
static表示静态全局变量,只能初始化一次。
四、多线程
https://www.runoob.com/cplusplus/cpp-multithreading.html
4.1 进程与线程
基于进程和基于线程。
基于进程的多任务处理是程序的并发执行。
基于线程的多任务处理是同一程序的片段的并发执行。
程假设使用的是 Linux 操作系统,我们要使用 POSIX 编写多线程 C++ 程序。POSIX Threads 或 Pthreads 提供的 API 可在多种类 Unix POSIX 系统上可用,比如 FreeBSD、NetBSD、GNU/Linux、Mac OS X 和 Solaris。
4.2 多线程
https://www.cnblogs.com/jmsjh/p/7762034.html
1、进程就是活着的程序,程序不过是一些文本,运行着的程序就是进程,是系统进行资源调度和分配的基本单位,掌握资源,包括内存等,线程就是轻量级进程,是CPU调度和分派基本单位。
2、由于进程占有资源,压栈和出栈慢,所以切换不灵活,线程不占资源,只占必要的资源(递归要压栈所以有一点资源),所以线程容易通信->在进程分来的内存中直接通信,容易并发->切换灵活,同一进程的线程切换速度很快,因此线程开销小
3、地址空间,进程独立,同一进程的线程共享资源,对其他进程的线程独立
五、形参和实参
5.1 形参与实参定义
形参:全称为“形式参数”是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。形参的作用是实现主调函数与被调函数之间的联系。
实参:调用时传递给函数的参数,即传递给被调用函数的值。
形参被调用的时候才开辟内存单元,一般是实参传递值给形参,而形参不能传递值给实参。除非加引用 & 。
5.2 例子
int add(int a, int b){
return a + b;
}
int main(){
int x = 1, y = 6;
int w = add(100, 200);
int z = add(x, y);
return 0;
}
上面代码中,a和b用于定义函数,是形参。x,y,100,200有具体的值,是实参。