什么是数组
数组:类型相同,内存连续的集合。数组的定义格式,是由基本数据类型,数组名[数组大小],数组大小必须是常量,不可以是变量。但在c99标准中,引入了变长数组的概念,这时候数组大小允许是变量,但是这种数组不可以直接初始化,但不是任何编译器都支持c99标准,vs编译器不支持变长数组的概念,但gcc编译器支持c99中变长数组的概念.
数组初始化
可以不给数组大小,直接初始化,通过存储的数据求出数组大小
也可以这样
char ch[]="hello world";char 类型也可以用字符串来初始化
在这里补充一下,[]是下标引用操作符,数组中存储的数据都是通过下标来访问的。
比如arr[5],他有两个操作数,一个是arr,一个是5
什么是指针
int *a,a就是指针变量,int*表示是类型是整形的指针
指针是用来存放地址的
就好像平时我们买电脑或者电子产品16+515,16g是内存,512g是硬盘。通俗来讲内存就是一个栋楼,为了有效使用内存,就把内存划分为一个个小的格子,就把那栋楼分为1楼2楼3楼...层,我们给每个小格子编个号,类似每层楼的门牌号,那这个编号就是内存单元的地址。因为通过地址可以很好的找到这个内存单元,所以地址又可以形象的称为指针。一个内存单元的大小是一个字节
那内存编号是如何产生的
内存单元的编号是如何产生的如果是32位机器,通电之后会产生电信号,电信号为正电和负电,电信号最后转换成数字信号之后便由32个0 1组成的二进制序列 那32个0 1组成的二进制有多少种可能性呢 从32全0————32个全1这么多种可能性,这个中间产生的二进制序列就可以当作内存单元的编号
而编号如何产生的从而引出了一个指针变量的问题。
int a =10; 对于这个10在内存中开辟了自己的空间,而这个10占四个字节的空间,每一个字节都有一个编号,理论上讲,那a有四个地址,那用四个地址去访问它比较麻烦,这个时候&a的时候,拿到的是a的四个四个字节中第一个字节的地址,那这时候给他存起来int *pa=&a ,那pa就是指针变量,那指针变量pa类型怎么写呢 int *就可以,这个*说明pa是指针变量, 而前面的int说明pa指向的对象a其实是整形类型的,这时候pa的类型就是int * ,*pa这时候就可以通过pa很好的找到a;
*是个操作符叫做解引用操作符,*pa就是找到pa指向的对象是谁
关于地址
地址一般都是以十六进制的形式打印出来的,如下,int四个字节每个字节都有地址,地址是0x开头,&a是取第一个字节的地址,所以0f就是第一个字节,0f十六进制转化成10进制就是15.
关于进制转换
十六进制最大就是15,逢16进1,15用16进制表示就是f,14是e,13是d,12 是c ,11是b,10是a
1个16进制位是四个二进制位表示,一个二进制位是一个bit位,八个bit位是一个字节,
八进制位逢8进1最大是7用二进制表示111,所以3个二进制表示一位八进制位
十进制转化成二进制,比如十进制的136转化成二进制 十进制转8进制和16进制和二进制同理,不过一个是/16一个是/8
136/2=68余数0
68/2=34余数0
34/2=17余数0
17/2=8余数1
8/2=4余数0
4/2=2余数0
2/2=1余数0
1/2=0余数1
二进制序列就是10001000从下到上.
指针类型的大小
指针是用来存放地址的,指针需要多大空间,取决于地址需要多大空间
在32位机器由32个bit位组成的二进制序就是个地址,换算字节那不就是4个字节嘛。内存编号如何产生的的那里写过。同理64位机器,由64个bit组成的二进制序列也是个地址.