数组、指针
一、数组与指针(个人认为)
什么是数组?
我认为:
数组就是一个容器,用来存放各种类型的数据。
书上说
什么是指针?
我认为:
指针也是一种变量类型,只不过它存放的数据是地址,而我们正好可以通过这个地址去找到这个地址所对应的内存空间。通过*号,可以改变那块空间中的值。
书上说:
数组和指针有什么关系?
我认为:
由于数组可以存放各种类型的数据,因此也能存放指针。(指针数组)
指针中存放的是地址,因此也能存放数组的指针。(数组指针)
书上说:
二、指针
说到指针,就一定要先了解下*的作用
1、*的用法
看作一把钥匙,去解锁指针指向空间中的内容。
区分int *p =NULL 与 *p = NULL
前者是初始化定义一个指针指向空,后者是赋值,将p指向空间的内容赋值成0;
大部分系统NULL被宏定义成0:#define NULL 0。(扩充:NUL与NULL不同,前者是ASCII码中的第一个数,也就是空字符)
注意:在将地址0x12ff7c这块地址赋值给指针时,一定要强制类型转换成指针类型
指针只能改变变量的值,常量无法改变
三、数组
1、Sizeof(a[5])结果为5,为什么没有出错。
由于sizeof是一个关键字并不是函数,在使用的时候是根据数组存放的类型来确定值的,并没有真正的去访问。
2、
Sizeof(&a[0])
Sizeof(&a)
前者是数组a首个元素地址的大小,32位系统是4,64位系统是8
后者是求数组a的首地址地址大小,32位系统是4,64位系统是8
3、数组名a出现在赋值符号左边和右边的区别
出现在左边:
a不能作为左值:我们只能访问元素,而a是一个整体不能。
出现在右边:
指的是数组首个元素的地址.
但是编译器没有为数组名a开辟一个空间存放地址,而指针是有空间的。
四、指针与数组的恩恩怨怨
1、指针是指针,在32位系统永远占4个字节,其值是某一个内存的地址。
指针可以指向任何地方,但不是任何地方都能通过指针访问到呢?
数组就是数组,他的大小与元素的类型和个数有关,定义数组的时候必须说明数组的个数与元素类型。
2、*(p+4)与a【4】;本质是没有区别的
前者:把p指针加上4个字符的偏移量,让后取出此地址的内容 (匿名访问)
后者,也可以解读为先取出p存储的地址,再将地址加4个字节的偏移量,记录新的地址,取出新地址的内容。 ( 具名+访问)
3、3、定义为数组,声明为指针(错误的)
在文件a中定义char a【100】
在文件b中声明extern char *a
在文件b中a只是声明为一个char类型的指针,在对其操作的时候是以指针的所占空间来取a的内容的地址当中地址,编译器一次性取出前4个字节的值当做地址,但这个并不是有效的地址。
4、定义为指针,声明为数组
在文件a中定义char *p
在文件b中声明extern char p[]
在b文件中,p是一个数组,元素类型为char,因此就将a文件中的指针存放的地址4个字节,拆成4个1个字节的地址分别当做4个元素的地址
牛客网
1、
优先级顺序:移位大于异或大于赋值。
2、
0表示八进制
3、
16位系统没有内存对齐因此是12,下面有在64位系统下的测试,结果是20
64位系统测试