指针是什么?如何理解指针?
因为指针是抽象的,所以这里我把它拟物化,这样解释也许跟容易懂。
指针的专业解释是:指针是内存单元的编号。
说明:以下的黑方框都代表一个字节
1)对于内存。
我们一般认为内存的基本单位是字节,内存空间由很多字节组成的。
内存可以存储数据,所以我们把每个字节当做是一个“箱子”。
数据存入内存就好比在箱子里面放数据
但是,C语言中各个类型在内存中占得字节数是不一样的。
比如char型,只要一个字节就够了,所以一个字符只需一个“箱子”。
而int型需要4(一般是4个字节)个“箱子”才放得下。
double型则需要8个“箱子”。
2)编号。
内存中每一个字节都有一个编号(是一个用16进制表示的值),这就是指针(或者说地址)。
这就好比仓库,为了方便管理货物,为箱子都编了号。
3)数的存储。
int a=100;
内存中的状态:
定义a=100,a占4个字节,也就是有4个指针,那么,哪个指针才是指向a的呢?
当一个数据占2个及以上字节的内存空间时,把第一个字节的地址当做他的指针。
也就是说,这里的0022FEE0才是a的指针。
4)数组与指针。
我们知道,数组的元素在内存中是连续储存的。
int arr[3]={1,2,3};
内存中的状态:
①a[0]的(指针)地址是:0022FEE0
a[1]的(指针)地址是:0022FEE4
a[2]的(指针)地址是:0022FEE8
②数组名也是一个指针,它的值是第一个元素的地址
即:arr == &a[0]
值得注意的是:数组名是一个指针常量,也就是说他的值是不能改变的。
比如 arr++ ,arr - -等试图改变arr的值的做法都是不合法的
③arr是第一个元素的地址,arr+1是第二个元素的地址,arr+2是第三个元素的地址。。。
有人会问:第二个元素个第三个元素的地址难道不应该是arr+4和arr+8吗?
注意:数组中arr+n指的是arr指向的元素的后面第n个元素的地址。
实质上来说,应该是:arr+k*n 。因为我们开始定义数组为int型,所以编译器自动取K的值为4。
k是一个由编译器根据数组类型自动确定的值。
也就是说,arr[1]的地址是:arr+4*1 arr[2]的地址是:arr+4*2
仅作了解,我们在写代码时万万不能按照这个思路