c++基础知识汇总(五)基本类型|内存分配|全局变量|多线程|形参实参

  • c++基本的数据类型 ?
  • int在32位占多少?
  • 变量声明和定义,内存分配时有啥区别?
  • C的内存分配策略
  • 局部变量全局变量可以重名吗,如何在局部使用全局变量

目录

一、c++基本的数据类型

1.1 基本类型

1.2 变量声明与定义区别

二、c++内存分配策略

2.1 数据结构中

2.2 操作系统中

2.3 举例

三、全局变量

3.1 局部与全局

3.2 全局变量的引用

四、多线程

4.1 进程与线程

4.2 多线程

五、形参和实参

5.1 形参与实参定义

5.2 例子


一、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有具体的值,是实参。

发布了210 篇原创文章 · 获赞 584 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/weixin_36474809/article/details/101275148
今日推荐