先讲个人对指针和数组的浅理解
我们已经知道 指针是一个变量,与普通变量的区别在于,指针里面存值的是另外一个变量的地址值。
由此可知一个数组指针变量(一个指向数组的指针)其里面存放的值应该为其数组的首地址。
那如何去直观的理解呢?
关于字符型数组和指针
此处先看一段代码:
以上定义了一个 字符型数组time1[], 定义了一个指针time 用于指向该数组;我们看下然后分别打印一些值,%p :打印地址,%s :打印字符串。 下面 我们来观察一下打印结果
我们可以看到 直接 %p 打印time 与%p打印time1[] 得出的地址是一样的,由此可以得出打印time的地址实际上是time指向的变量的地址值,即数组的首地址。那如何去确定指针本身的地址呢?在上述代码中加上&(取地址符)即&time 即可得到指针time 本身的变量地址。
如何打印字符串型数组中的值,在上述代码中用的是%s与指针配合,或者%s与数组名配合,打印数组整个字符串。
关于整型数组和指针
先看一段代码:
以上定义了一个整型数组和一个整型指针,并将其赋值,分别打印其值和其地址值
先看结果:
第一行:打印指针所指向地址的值,第二行:打印a[0]的值。由以上两条可以更加清晰的认识到指针式指向数组首地址的。
再看第三行打印的式数组名的地址值,第四条打印的是数组名取地址的地址值,之前说过要打印指针本身的地址值需要加指针变量前需加&,而如果不加则打印的是该指针指向变量的地址值。这个知识点搬移到此处,我们可以分析一下,可知实际上数组名就是一个指向该数组首地址的指针,这个点我们结合第五行,便可以更清晰的得到。第六行的地址符合整型数组下标+1,地址+4规律(整型占四个字节)。
关于完整打印整型数组的值,应该用for循环改变下标,后者用指针的自加,那么问题来了,指针是如何自加的。
指针自加
先看一段代码:
以上第一行我们可以看出数组名取地址+1,其地址增量会横跨整个数组(二维数组跨行)
第二行,是在整个数组中的相对偏移量,并非实际的映射地址,看下图可以理解
关于指针自增,通过上面的所有代码,我们并不难看出 指针自增的地址变化和其类型相关,例如:char 型每次自增,其指向的地址1,而int型指针每次自增,其指向的地址+4。
以上是本人对指针和数组的浅薄理解。