今天继续对于C语言的指针进行学习,话不多说,进入正题。
数组作为参数传递【指针传递】:
下面通过一系列程序来说明数组作为参数传递是属于指针传弟:
一维数组:
![](https://images0.cnblogs.com/blog/324374/201312/16211130-0aeaaf2b48fb4d79acb70a3651550f0e.png)
编译运行,看结果:
![](https://images0.cnblogs.com/blog/324374/201312/16211312-b5dc04bb438846c090954e164c2964fa.png)
![](https://images0.cnblogs.com/blog/324374/201312/16211806-da4f19aa238b4635bdaa0183a1d187f6.png)
编译运行:
![](https://images0.cnblogs.com/blog/324374/201312/16211923-c3a584a3bef74c509f9d70f6fae42b76.png)
我们知道“数组定义之后,它的首地址是无法重新指向新地址的”,如下:
![](https://images0.cnblogs.com/blog/324374/201312/16212208-02491ca46463432ba84b17015c5d68d7.png)
编译:
![](https://images0.cnblogs.com/blog/324374/201312/16212305-35672943cd934b92babff31ced3f072c.png)
而请看如下情况:
![](https://images0.cnblogs.com/blog/324374/201312/16212516-10d072517a5e458e9c7e2b7eb319d05e.png)
编译运行:
![](https://images0.cnblogs.com/blog/324374/201312/16212621-0d9708141c544494bce72e5177a09765.png)
说明:当一维数组作为函数参数时,有三种写法都等价,都是int*a
![](https://images0.cnblogs.com/blog/324374/201312/16210842-2bd0a073963c4397abfb11a041cf999c.png)
二维数组:
![](https://images0.cnblogs.com/blog/324374/201312/16213425-40848c4f99fe423d8a14d0127d880919.png)
编译:
![](https://images0.cnblogs.com/blog/324374/201312/16213528-14a9376cfb6b4c3ca63488e9fefbd2c3.png)
如果省略了二维数会怎样呢?
![](https://images0.cnblogs.com/blog/324374/201312/16213704-e20f3580902d440699929cc918d2d944.png)
编译:
![](https://images0.cnblogs.com/blog/324374/201312/16213830-9f8923cc2d564f2a9f5991a7d74e90b3.png)
说明:
![](https://images0.cnblogs.com/blog/324374/201312/16214000-a92fde982a894e7a8dd8fbf7270bef01.png)
命令行参数:
![](https://images0.cnblogs.com/blog/324374/201312/16214149-826adc200fd948828ef0dcb0f9eb64b6.png)
main函数是程序的入口函数,今天来对其参数进行研究,先通过程序来直观的感受下:
![](https://images0.cnblogs.com/blog/324374/201312/16215122-60604f1342e6414aa9be567bed1dd7dc.png)
运行结果:
![](https://images0.cnblogs.com/blog/324374/201312/16215542-49cf6922aa134b7da994c04a329ab172.png)
分析一下内存模型:
![](https://images0.cnblogs.com/blog/324374/201312/16220210-289d2e4b23d84cc6b8be1f72be7a6c18.png)
所以,可以通过循环,将命令行的所有参数都打印出来:
![](https://images0.cnblogs.com/blog/324374/201312/16220400-9fd212b5105b4dca8087c2ae42ac0c70.png)
![](https://images0.cnblogs.com/blog/324374/201312/16214159-088cf05d2af741a99a29de338f50db07.png)
对于上面的程序,也能用指针的指针来代替,两种方式是等价的:
![](https://images0.cnblogs.com/blog/324374/201312/16220719-6aa58caa53e344b4b5576bde2011a8f1.png)
输出结果:
![](https://images0.cnblogs.com/blog/324374/201312/16220817-a3ae1ca5059741f4a9382deb738a4088.png)
结构体指针:
![](https://images0.cnblogs.com/blog/324374/201312/16221014-fc07274a6a0e4d73b28ce84db0b0f7b5.png)
下面通过代码来进行说明:
![](https://images0.cnblogs.com/blog/324374/201312/16221913-d4f0710f584a4fcfb0d691d69ea541bc.png)
运行结果:
![](https://images0.cnblogs.com/blog/324374/201312/16222114-c37394e3cd5a4d71821dd182705e6fb2.png)
从运行结果上来看,貌似跟理解有点违背,事实上上面的输出0是不确定的,但是为了确保malloc分配的结构体成员被初始为0,需用到memset函数,用man查看下:
![](https://images0.cnblogs.com/blog/324374/201312/16222328-ce60a008efa84671b56f9ef1140b402a.png)
![](https://images0.cnblogs.com/blog/324374/201312/16222450-e095bffcd194499ca54d68450c63d6f1.png)
注意:malloc分配的内存,是没有设置的,对于这个结构体,也就是里面的成员都是没有初始化的,这时可用memset函数进行初始化
![](https://images0.cnblogs.com/blog/324374/201312/16223146-646610bc333a41808e8a772e93bc58cf.png)
其实对于上面这个,可用一个函数来代替:calloc,查看man帮助:
![](https://images0.cnblogs.com/blog/324374/201312/16223324-102374a4acec481c9462e9581e716b93.png)
![](https://images0.cnblogs.com/blog/324374/201312/16223413-351b99672fff4007ab0533589d384fad.png)
从上面帮助来看,calloc=malloc+memset
![](https://images0.cnblogs.com/blog/324374/201312/16223605-7864ec687fab49069853d7c502e9d812.png)
运行结果一样:
![](https://images0.cnblogs.com/blog/324374/201312/16223705-e14b5fbb9f0342fba8b55953c51bb23c.png)
下面介绍一下内存拷贝函数:memcpy
![](https://images0.cnblogs.com/blog/324374/201312/16224805-0c713ead0891451a9e867981301d32e4.png)
看具体使用:
![](https://images0.cnblogs.com/blog/324374/201312/16224825-aaad52083ffe41598b1ee150c853d767.png)
运行:
![](https://images0.cnblogs.com/blog/324374/201312/16225131-347ea031b8bc4518bf6e3fc28d840fdc.png)
![](https://images0.cnblogs.com/blog/324374/201312/16225235-d373bab99ebe4645975476b64496bd5b.png)
分开理解:
结构体定义时不能定义自身结构体变量
![](https://images0.cnblogs.com/blog/324374/201312/16230013-50f15d846361492d9495d7640b4155ef.png)
编译:
![](https://images0.cnblogs.com/blog/324374/201312/16230126-acdd203902a1428182c3c5f2e79345a3.png)
但可以定义自身的指针:
![](https://images0.cnblogs.com/blog/324374/201312/16230238-84b119acebb249dbae9c63b0b465bf37.png)
编译:
![](https://images0.cnblogs.com/blog/324374/201312/16230309-87e1f51da8b843c8b346cc0525dbb572.png)
好了,今天的内容学到这,下次再见!!