c++内置变量类型
2014-06-09 16:47
239 查看
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)。
栈是向着低地址方向增长,堆是向着高地址方向增长
数组与指针
元素为指针类型的数组:
double* (*a)[3][6] : a 是一个指针,指向一个数组,数组是3行六列,并且数组中的元素类型为double*
数组类型的字符串存储在栈
指针类型的存储在常量区域
当数组作为函数实参传递的时候,退化为指针。
数组是在存储空间是按照顺序存储的,对于二维数组a[m]
,下标从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成员函数
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)。
栈是向着低地址方向增长,堆是向着高地址方向增长
以二维数组a[4][5]为例,*可以人为和[]等价 &a (int*)[4][5] a (int*)[5] a[0]或者*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]
,下标从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++]内置类型变量在内存中的存放
- c++中自定义类型和内置类型,变量自增自减的差异
- 用标准C++进行string与各种内置类型数据之间的转换
- C++临时变量的另类应用:基于iostream的类型安全的log接口设计
- 解决 C++ Bulider 变量类型转换问题
- 用标准C++进行string与各种内置类型数据之间的转换
- 第01章 CORE C++_C++ 基本结构_注释_输出语句_输入语句_初始化_条件控制_ASCII码值_转义字符_常量_变量_类型长度_运算符
- C/C++每日一课 >> [原创]细说如何确定一个变量的类型(2005-04-25)
- C++中获取内置数据类型最大值、最小值的模板类
- C++内置类型对象转换
- c/c++笔试题——const类型的成员函数内部如何改变成员变量
- C++基础 - 内置类型和类类类型的初始化
- C++复习 02 变量和基本类型
- C++临时变量的另类应用:基于iostream的类型安全的log接口设计
- c++学习笔记:void*变量,在函数内必须要明确变量类型
- C++数据类型-常量和变量
- C++数据类型之一:常量和变量
- c++基础:const,变量的作用域和生存期,存储类型
- c++数据类型--文字常量、变量
- c++内置数据类型及范围