指针(四)
今天继续对指针进行研究,话不多说,进入正题:
指针数组与数组指针:
关于这两者的介绍,在http://www.cnblogs.com/webor2006/p/3463918.html有介绍,下面简单回忆下:
![](http://images0.cnblogs.com/blog/324374/201312/15142926-9438e8d53d1e49c485508be5643a9012.png)
以下通过一些示例来进一步理解指针数组和数组指针:
示例一:
![](http://images0.cnblogs.com/blog/324374/201312/15143837-b407e9a857054fd9896935e8dccf8ea5.png)
输出结果:
![](http://images0.cnblogs.com/blog/324374/201312/15143927-9ee162bcfe984c3c8eb7b136796208d0.png)
示例二:
![](http://images0.cnblogs.com/blog/324374/201312/15145342-bddc5b66102b43bebdfcb894f939cd88.png)
![](http://images0.cnblogs.com/blog/324374/201312/15145915-3003998d3ad9448f9d361ae60ba121f1.png)
运行结果:
![](http://images0.cnblogs.com/blog/324374/201312/15145428-8b326bcdfc8a4319876430a52327f1aa.png)
示例三:
![](http://images0.cnblogs.com/blog/324374/201312/15150735-667f2b61c33046e5ab8b54698e471025.png)
输出结果:
![](http://images0.cnblogs.com/blog/324374/201312/15150823-e2d1603e75ee45cbbf226da50016af1d.png)
指针数组与二维数组:
基于上面的实现,再来通过一个图来总结下指针数组与二维数组:
![](http://images0.cnblogs.com/blog/324374/201312/15151553-f5aa5724060c4c97b9acea9069c8c0c0.png)
指针的指针:
![](http://images0.cnblogs.com/blog/324374/201312/15151830-bf7c241c54694880bcd7b31aa0f8017b.png)
下面通过一程序来直观的感受下:
![](http://images0.cnblogs.com/blog/324374/201312/15152134-4e519023f4ee41849202f318e46d6d81.png)
运行:
![](http://images0.cnblogs.com/blog/324374/201312/15152224-30495fd36f8a456dabbc51aa965ba849.png)
下面通过一个实例来说明下指针的指针的使用场景:
![](http://images0.cnblogs.com/blog/324374/201312/15152957-257b596709a84220a5c66f655da3ebe6.png)
运行结果:
![](http://images0.cnblogs.com/blog/324374/201312/15153133-5a7aea2292e34b17b7ce085e765c55cb.png)
上图中可以看到find函数使用了指针的指针,那为什么要用它呢,我用一级指针是否能达到同样的目的呢,来看下面的尝试:
![](http://images0.cnblogs.com/blog/324374/201312/15154000-57fc0d2c54bc475e94713b0ee568b719.png)
编译运行:
![](http://images0.cnblogs.com/blog/324374/201312/15161816-d588908db12743b0b9d9dab20d113bd1.png)
这是为什么呢?下面来对其两种实现方式进行分析:
先分析一级指针的错误实现方式:
![](http://images0.cnblogs.com/blog/324374/201312/15163215-a6808eaee96d45a3b9fe1effebb97454.png)
![](http://images0.cnblogs.com/blog/324374/201312/15163740-e1a62744b5b944ff8341b9c3ba933c93.png)
要想通过形参来改变实参指针的地址,这时就得采用指针的指针的,这也就是为什么要用它的原因,下面接着来分析为啥用指针的指针能改变实参指针地址:
![](http://images0.cnblogs.com/blog/324374/201312/15165126-7b82e20dc737419393ec37554bc5d704.png)
![](http://images0.cnblogs.com/blog/324374/201312/15165422-ab42352ea2a94447bee23c65bd5523c6.png)
所以,通过指针的指针,就能改变指针本身的地址。
指针的指针注意点:
![](http://images0.cnblogs.com/blog/324374/201312/15213953-35004f51f22c45e3b458f6b949c8a681.png)
下面进行说明:
![](http://images0.cnblogs.com/blog/324374/201312/15215545-170dbbbc30f743329430b47dc820068f.png)
编译运行:
![](http://images0.cnblogs.com/blog/324374/201312/15215840-d639f169b6e54b5bb0e550536e9d5926.png)
![](http://images0.cnblogs.com/blog/324374/201312/15220218-be7f15e35fe744cbab6ef5f16dd3a852.png)
运行结果:
![](http://images0.cnblogs.com/blog/324374/201312/15220558-beec28b173b94e62be4c1748f884982c.png)
解释一下“
char** p = color;
”![](http://images0.cnblogs.com/blog/324374/201312/15221058-4ab3e02c0c7246da8ce02363c16d3813.png)
所以,如果访问p[0]的内容,则会出错:
![](http://images0.cnblogs.com/blog/324374/201312/15221325-74f338792acc406f9d66d7adf423b500.png)
运行:
![](http://images0.cnblogs.com/blog/324374/201312/15221522-e9215af045484ee6a293831725d437ae.png)
![](http://images0.cnblogs.com/blog/324374/201312/15214004-fe8c5f53d6a345cbb234953363668c6c.png)
它对应的内存模型为:
![](http://images0.cnblogs.com/blog/324374/201312/15221938-cce1e7f6af0a4d4db804763114aead6b.png)
![](http://images0.cnblogs.com/blog/324374/201312/15222417-77890eaac7bf4ba59e97dca5cb5964d4.png)
输出:
![](http://images0.cnblogs.com/blog/324374/201312/15222455-9db266fe4dbc43e6be0041f94c0a8711.png)
但是下面这个得注意了:
![](http://images0.cnblogs.com/blog/324374/201312/15222942-de472eaae0644d18bc3ed808e9893b7e.png)
运行:
![](http://images0.cnblogs.com/blog/324374/201312/15223037-4e1cd2922d704daf9c7453c4ceb58454.png)
好了,今天指针的探讨先互这,要理解清楚指针,就得搞清楚数据存放的内存模型,下次见!!