打印如下:
说明: 前面我们已经验证了指针变量p是指向数组第一个元素的地址,即为p=0012FF34,所以如果要想访问第一、三个元素,那么就需要使得p分别指向第一个第三个元素的地址。由于数组的下标是从0开始的所以指针p指向的元素的下标是0,所以p+2就是指针第三个元素,(p+2)=0x0012FF3c,所以*(p+2)就是取第三个元素。
既然用指针可以访问数组元素,那么如何用指针来遍历数组 打印如下: 说明: 通过上面有关知识的说明我们知道,p指向数组的第一个元素,也就是下标为0的元素,所以p+i表示指向下标为i的元素,又因为加*表示取指针中的值。如*p表示,取p中的值,而*(p+i)表示取p+i中的值。所以通过for循环可以打印出数组中的元素。
下面看一个例子: 要求:用指针来逆序数组 程序如下: 子函数一
子函数二 打印如下: 这里写了两个子函数,子函数一的形参变量是一个形参数组而子函数二中的形参变量是一个指针变量,这两只方法都可以实现目标。 子函数一可以实现的原因: 把实参数组a的地址传给了形参数组arr,arr会以传来的地址为首地址开始向下取出数组中的元素赋给自己,所以在子函数中数组arr就相当于是数组a。但是在内存中子函数中进行的元素交换还是在数组a中进行的,所以说“arr会以传来的地址为首地址开始向下取出数组中的元素赋给自己”这样说是为了好理解。
子函数二可以实现的原因: 因为子函数中的形参是指针变量P,所示调用子函数时会把实参数组a的地址传给了指针变量p,也就是说指针p指向了数组a的内存空间。所以在子函数中做的一切命令,直接是在实参数组的内存空间中进行的。
下面的程序可以更好的反应了:数组名是一个地址、指针只接受地址 打印如下: 关于nX(&a[2],8)说明: &a[2]:表示把数组a的下标为2的地址传送给arr[ ] 8 :这是因为我们的数组长度为10,如果从第二个地址开始访问,向下访问10个就会发生越界。越界是危险的!
下面打印一下越界现象来看看(一般禁止越界操作)
打印如下: 总结: 指针就是地址,指针是一个变量 数组名也是个地址,数组名是一个常量
|