1,各种变量占据的内存空间

char:1个字节,也可亦作为0-255的数值参与运算

一般来说,静态存储区的自动赋初值,动态则不自动(貌似也不对,因为非内置变脸的类型,也都调用了默认构造函数进行初始化)

各种类型的sizeof(为size_t类型,其实就是unsigned int)

sizeof是运算符,不是函数,这点和new和delete类似

一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack),由编译器自动分配释放,存放函数的参数值、返回值、返回地址,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap),一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(.data),未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(.bss)。程序结束后由系统释放。
4、文字常量区—常量字符串就是放在这里的(.rodata)。程序结束后由系统释放。
5、程序代码区—存放函数体的二进制代码(.text)。

栈是向着低地址方向增长,堆是向着高地址方向增长

sizeof(int):;
sizeof(long):;
sizeof(longlong):;
sizeof(short):;
sizeof(char):;
sizeof(float):
;sizeof(double):;
sizeof(指针):
以上随着操作系统的不同,可能略有差异
在64位系统中,sizeof(指针)为8
再windows环境下,汉字使用gbk编码,占用两个字节
再linux环境下,汉字是哟功能utf8编码,占用3个字节

sizeof运算结果

不过自己式了一下,sizeof('我')居然是4,不明白为啥子

关于变量的初始化:

函数体外的内置类型,元素初始化为0。

函数体内的数组的内置类型,不进行初始化

对于非内置类型,不管再哪里定义,都自动调用其默认构造函数进行初始化

动态创建的类型如果是内置类型,不进行初始化,如果是类类型,调用其默认构造函数进行初始化。

2,常变量、局部变量和全局变量

c++里面的常变量一般使用 const int a=3 (声明同时必须进行初始化)

java里面的常变量采用 final static int a=3的方式

c里面的常变量采用define,和const的不同在于define没有类型,只是简单的字符串替换和展开

局部变量是在函数内部定义的变量

全局变量是在函数外定义的变量

3,数组

) 数组元素类型不能是引用类型
)数组元素的初始化
函数体外的内置类型(全局数组),元素初始化为0
函数体内的数组的内置类型,不进行初始化,但如果初始化部分元素,后面元素会被初始为0
对于非内置类型,不管再哪里定义,都自动调用其默认构造函数进行初始化
(java则是类的成员变量和局部变量的区别)
)数组声明
int a[]
(java里面一般采用的是int[] =new int[])
(java里面的引用类型都需要new,然而c++里面只有动态存储才需要)

c++数组

以二维数组a[][]为例,*可以人为和[]等价
&a (int*)[][]
a (int*)[]
a[]或者*a int*
*(a+i) 或者a[i] int*
*(*(a+i)+j) int
*(a+i)=a[i]
*a((a+i)+j) =a[i][j]
知道了类型之后,对应指针的步长也一目了然

数组与指针

元素为指针类型的数组:

double* (*a)[3][6] : a 是一个指针,指向一个数组,数组是3行六列,并且数组中的元素类型为double*

数组类型的字符串存储在栈

指针类型的存储在常量区域

当数组作为函数实参传递的时候,退化为指针。

数组是在存储空间是按照顺序存储的,对于二维数组a[m][n],下标从0开始

如果是行优先存储,那么a[i][j]的存储位置是:n*i+j*m

如果是列优先存储,那么a[i][j]的存储位置是:m*j+i*n

int a[4][5]={1,2,3,4,5,6,7,8,9}这样的数组,其*(*(a)+6)是有值的,相当于一维初始化时候的a[6]=7

4,变量的存储位置、存储类别和作用域

(声明和定义的区别,对于函数来说,这个区别是很明显的,对于变量来说,我们把建立存储空间的称为定义(如静态存储,这也是静态存储可以自动初始化的原因)),吧不需要建立存储空间的称为声明

存储位置分为静态和动态:

静态存储区: 全局变量,static声明的局部变量

动态存储去:函数形参、动态局部变量、函数的现场保护和返回地址等

存储类别分为:auto(默认),static(静态),register(不用)和extern(外部)

作用域:分为局部和全局的

存储类别影响存储位置,也影响作用域。

下面分别介绍extern和static的作用:

extern:

全局变量默认的作用域是从变量定义到本程序文件结尾。extern可以用来声明全局变量,对其作用域产生影响。

extern在一个文件中声明全局变量:提前引用声明,其作用域扩展到从声明处到文件结束

extern 在多文件中声明外部变量:如果两个文件复用同一个变量,可以在一个文件中定义,在另一个文件中用extern声明(代表已经在其他文件有定义)

函数和变量相反,默认extern,是外部函数(可被其他文件调用),

static:

static声明使得变量采用静态存储方式,但它对局部变量和全局变量是不同的

对局部变量来说,static使得其动态存储变为静态存储,导致其在函数中的可见性和存在性不一致

对全局变量来说,仍为静态存储方式,但是作用域局限到本文件内

static声明的函数是内部函数,只能再文件内部被调用

static 在类中,代表成员属于这个类而非特定对象。类的普通成员和静态成员都不能再类定义体内初始化,只能在定义体的外部进行初始化。

(变量或函数的作用域在文件内和文件外和是否include无关,include相当与蒋多个文件写入了一个文件,本质还是文件内部)

 5,const作用

1)用来声明常量

const int a=5定义一个常量

全局变量,在整个程序中都可以访问(只要提前再使用的地方利用extern声明)

然而const修饰的全局变量,必须利用extern const int a=5;在其它文件才可以被访问

2)指针和const修饰符

const 类型 * ptr 或者 类型 const * ptr 为指向常量的指针。

类型 * const ptr 代表一个常指针

(从右向左读)

3)类与const

const数据成员,必须再构造函数中进行初始化,初始化之后其值不能更改

const成员函数 void func() const

const 对象 类名 const 对象名[(实参列表)] 也可以是 const  类名 对象名[(实参列表)]

非const成员函数可以调用非const成员变量且可以修改,可以调用const成员变量但是不能修改

const成员函数可以调用非const成员变量且不能修改,可以调用const成员变量且不能修改

const对象只能够引用const成员函数

 

c++内置变量类型的更多相关文章

  1. go基础语法-内置变量类型

    1.内建变量一览 bool,string (u)int,(u)int8,(u)int16,(u)int32,(u)int64,uintptr 无长度int的实际长度取决于操作系统位数(32/64) u ...

  2. 【Go入门教程4】变量(var),常量(const),内置基础类型(Boolean、数值 byte,int,rune、字符串、错误类型),分组,iota枚举,array(数值),slice(切片),map(字典),make/new操作,零值

    这小节我们将要介绍如何定义变量.常量.Go 内置类型以及 Go 程序设计中的一些技巧. 定义变量 Go 语言里面定义变量有多种方式. 使用 var 关键字是 Go 最基本的定义变量方式,与 C 语言不 ...

  3. 【Go入门教程2】内置基础类型(Boolean、数值、字符串、错误类型),分组,iota枚举,array(数值),slice(切片),map(字典),make/new操作,零值

    这小节我们将要介绍如何定义变量.常量.Go内置类型以及Go程序设计中的一些技巧. 定义变量 Go语言里面定义变量有多种方式. 使用var关键字是Go最基本的定义变量方式,与C语言不同的是Go把变量类型 ...

  4. Maven系列三Maven内置变量

    Maven内置变量说明: ${basedir} 项目根目录(即pom.xml文件所在目录) ${project.build.directory} 构建目录,缺省为target目录 ${project. ...

  5. Maven的内置变量

    Maven内置变量说明: ${basedir} 项目根目录(即pom.xml文件所在目录) ${project.build.directory} 构建目录,缺省为target目录 ${project. ...

  6. Maven内置变量说明

    Maven内置变量说明: ${basedir} 项目根目录 ${project.build.directory} 构建目录,缺省为target ${project.build.outputDirect ...

  7. 学习笔记——Maven 内置变量

    Maven内置变量说明: ${basedir} 项目根目录(即pom.xml文件所在目录) ${project.build.directory} 构建目录,缺省为target目录 ${project. ...

  8. Perl中的特殊内置变量详解

    #!/usr/bin/perl -w @array = qw(a b c d); foreach (@array) { print $_," "; } 例子的作用就是定义一个数组并 ...

  9. Maven内置变量

    1.Maven内置变量说明: ${basedir} 项目根目录 ${project.build.directory} 构建目录,缺省为target ${project.build.outputDire ...

随机推荐

  1. RocketMQ吐血总结

    RocketMQ吐血总结 架构 概念模型 最基本的概念模型与扩展后段概念模型 存储模型 RocketMQ吐血总结 User Guide RocketMQ是一款分布式消息中间件,最初是由阿里巴巴消息中间 ...

  2. RabbitMQ入门教程(四):工作队列(Work Queues)

    原文:RabbitMQ入门教程(四):工作队列(Work Queues) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https:/ ...

  3. 将数据库模型放入到.Net Core的类库中

    一.前提概要 今年某天突然无聊,就决定学习.net core,此时的版本已经是.net core 1.1了.之前一直是用.net framework做项目,一直对Html.EditFor()等Html ...

  4. 深入理解java虚拟机(2)

    一.对象的访问 ----------------------------------------------------- 1.对象的访问与java栈.堆和方法区之间的关联关系. eg:Object ...

  5. MySQL第三讲 一一一一 视图、触发器、函数、存储过程

    1. 视图 1.1 视图前戏 我们之前讲有,临时表的概念. 现在我们创建一个临时表:select * from (select * from tb1 where id between 10 and 1 ...

  6. 利用ARouter实现组件间通信,解决子模块调用主模块问题

    如果你还没使用过ARouter请你按照这篇下面博客尝试使用下然后再往下看组件通信的内容(不然的话可能会懵逼)Android Studio接入ARouter以及简单使用 如果你使用过ARouter请继续 ...

  7. 初探CSS - 5 创建

    CSS 创建 当读到一个样式表时,浏览器会根据它来格式化 HTML 文档. 如何插入样式表 插入样式表的方法有三种: 外部样式表(External style sheet) 内部样式表(Interna ...

  8. Redis启动方式

    一.前端启动 直接运行bin/redis-server将以前端模式启动.[bin目录是在/usr/local/redis/bin] # ./redis-server 启动缺点: ssh命令窗口关闭则r ...

  9. Docker 镜像 容器 仓库

    Docker 包括三个基本概念镜像(Image)容器(Container)仓库(Repository) Docker 镜像 Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序.库.资 ...

  10. PAT Basic 1042 字符统计 (20 分)

    请编写程序,找出一段给定文字中出现最频繁的那个英文字母. 输入格式: 输入在一行中给出一个长度不超过 1000 的字符串.字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母, ...