复杂的数据类型
复杂=简单+简单
介绍三种数据类型:数组,指针,数据结构。
数组
数组是许多程序设计语言的重要组成部分,尤其在c程序中经常用到它们。
数组的优点在于,一个数组可以把多个不同类型的值存储在同一个变量名下。
数组仍需要被声明为某一种特定的类型:int,float,char
type name[x];
注意:我们不会把不同数据类型的数据混杂保存在同一个数组中,(不同物种不可杂交)。
指针
c语言和c++里最重要的数据类型之一:指针
内存:程序在硬盘上以文件的形式存在,但运行却是在计算机的内存里发生的。
int a=-12;
char b=M;
float c=3.14;
这些语句声明的变量在内存中的存放情况
对齐:在c++里,变量类型是根据它们的自然边界对齐的,对齐在计算机底层世界处处皆是,内存对齐,文件对齐。(程序在编译链接后会被分割成一个一个的区块,而区块在文件和内存中要按照一定规律来对齐)
一般32位系统内存对齐值是:1000H4KB(windows中一页就是4KB)
一般64位系统内存对齐值是:2000H8KB
文件的对齐值是:200H(在硬盘中)
寻址:对于变量可以用两种办法来对它进行索引。一种是通过变量名,一种是通过地址。
取址操作符"&",作用就是获得变量的地址。
实例int var=123;
std::cout<<“Address is:”<<&var;
变量的地址在程序执行期间不会发生改变,
同一个程序不同时间加载到内存中,同一个变量的地址是会改变的。(windows加载器原理和系统对程序的欺骗)
地址是计算机内存中的某个位置,而指针是专门用来存放地址的特殊类型变量。
一般用下面形式来声明指针变量:type *pointerName;
注意:int *p1,p2,p3;//只有p1是指针变量
指针变量前面的类型是用来说明指针指向的类型,务必匹配使用。
允许void类型的指针变量:void *p;
利用指针改变值
int a=456;
char b=‘C’;
int apointer=&a;
Char bpointer=&b;
这会让程序保留4个内存块,两个为变量保留,两个为指针保留。变量a和变量b里边存放的是变量的值;两个指针变量存放着指针的值,这些值是其他变量的地址。如下图
当我们知道了某个变量在内存中的地址(通过指针)·就可以利用指针访问位于该地址的数据。这需要对指针进行“解引用( Deference)“处理即在指针名的前面加上一个星号()。
std::cout << apointer;
这里我们来理解一下:把整数变量a的地址存储在 pointer指针里之后, pointer和变量a将代表同一个值。
因此: pointer=123;将会
1.一定要牢记的事实:指针所保存的是内存中的个地址。它并不保存指向的数据的值本身。因此,务必确保指针对应一个已经存在的变量或者一块已经分配了的内存
2.星号有两种用途
第一种是用于创建指针 int *myPointer =&myint;
第二种是对指针进行解引用 *my Pointer =3998;
C++允许指针群P,就是多个指针有同样的值
int*p1 =&myint;
int *p2=&myint;
C++支持无类型(void)指针,就是没有被声明为某种特定类型的指针
例如 void *vpointer;
注意:对一个无类型指针进行解引用前,必须先把它转换为一种适当的数据类型。