今天继续对于C语言的指针进行学习,话不多说,进入正题。
数组作为参数传递【指针传递】:
下面通过一系列程序来说明数组作为参数传递是属于指针传弟:
一维数组:
![](https://i-blog.csdnimg.cn/blog_migrate/65bb987f1a414742edc18003c8b4fc18.png)
编译运行,看结果:
![](https://i-blog.csdnimg.cn/blog_migrate/35886f3adb2c27cc8cc645f7d40c4068.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c730c633b5d76d7581277c9443bfeca7.png)
编译运行:
![](https://i-blog.csdnimg.cn/blog_migrate/62afb76e6f31ea790a60450553cd883b.png)
我们知道
“数组定义之后,它的首地址是无法重新指向新地址的”,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/a615e4f5b99cf5191f0e79485995e305.png)
编译:
![](https://i-blog.csdnimg.cn/blog_migrate/31dfcba2bf82e39093d82793f1781404.png)
而请看如下情况:
![](https://i-blog.csdnimg.cn/blog_migrate/ed058d8bbe9a14dfd9bbcbea136c25c3.png)
编译运行:
![](https://i-blog.csdnimg.cn/blog_migrate/d7f8f96868ba748d5b3e392c079e2eaf.png)
说明:当一维数组作为函数参数时,有三种写法都等价,都是int*a
![](https://i-blog.csdnimg.cn/blog_migrate/33a43263cf30438b19702da4635d2583.png)
二维数组:
![](https://i-blog.csdnimg.cn/blog_migrate/f074020a6eca874b0d6d27b83c2d512b.png)
编译:
![](https://i-blog.csdnimg.cn/blog_migrate/056f5042ce65a8c4d095b86a0bd0de08.png)
如果
省略了二维数会怎样呢?
![](https://i-blog.csdnimg.cn/blog_migrate/29d013539b03f401da7005a8c12dd002.png)
编译:
![](https://i-blog.csdnimg.cn/blog_migrate/04bea52ed14cc24b191f6d9798a3fe0b.png)
说明:
![](https://i-blog.csdnimg.cn/blog_migrate/6c41cd4ed4f8ca0ee66f89cddcd6b10a.png)
命令行参数:
![](https://i-blog.csdnimg.cn/blog_migrate/1826763f37c7aea955bd88a7017c378f.png)
main函数是程序的入口函数,今天来对其参数进行研究,先通过程序来直观的感受下:
![](https://i-blog.csdnimg.cn/blog_migrate/367a573fccbddb2c205f3d3c70255507.png)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/ae447b0927e5f0abfd3b39eb46925a46.png)
分析一下内存模型:
![](https://i-blog.csdnimg.cn/blog_migrate/6a20c832f2162fbc3cdc61b3df8ed9b3.png)
所以,可以通过循环,将命令行的所有参数都打印出来:
![](https://i-blog.csdnimg.cn/blog_migrate/753984849519a3b6e75e6fc4ba15dd33.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6041039510d9cff5ebcff233cab35497.png)
对于上面的程序,也能用指针的指针来代替,两种方式是等价的:
![](https://i-blog.csdnimg.cn/blog_migrate/50411223fa2e38f4cd1eb0688e2cdac8.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/12117d9f1175cebb270cb1fe788f4ad3.png)
结构体指针:
![](https://i-blog.csdnimg.cn/blog_migrate/d55f47bf0c84cc73c1d7bef3d113e859.png)
下面通过代码来进行说明:
![](https://i-blog.csdnimg.cn/blog_migrate/9be177c9d68aae1fa70e53dbc5ef305e.png)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/28b0d684330bb0e800a34f663edffd1f.png)
从运行结果上来看,
貌似跟理解有点违背,事实上上面的输出0是不确定的,但是为了
确保malloc分配的结构体成员被初始为0,需用到memset函数,用man查看下:
![](https://i-blog.csdnimg.cn/blog_migrate/e2d649a14364d2f3032086cf1574a247.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5de7c758262761338b56ebf4da72cb28.png)
注意:malloc分配的内存,是没有设置的,对于这个结构体,也就是里面的成员都是没有初始化的,这时可用memset函数进行初始化
![](https://i-blog.csdnimg.cn/blog_migrate/687c7f2ea520c17a1452000aba9ab201.png)
其实对于上面这个,可用一个函数来代替:calloc,查看man帮助:
![](https://i-blog.csdnimg.cn/blog_migrate/16a26b62742d389351bd759d6cab368f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cfeca29c76b238578e7063ed13950342.png)
从上面帮助来看,calloc=malloc+memset
![](https://i-blog.csdnimg.cn/blog_migrate/a5ab96ff71e13725f87a7b879e2258c4.png)
运行结果一样:
![](https://i-blog.csdnimg.cn/blog_migrate/2922f2fb659840d8140822f94b0da267.png)
下面介绍一下内存拷贝函数:memcpy
![](https://i-blog.csdnimg.cn/blog_migrate/ee8d8600c755ff0d65a7fc8830b9ce3a.png)
看具体使用:
![](https://i-blog.csdnimg.cn/blog_migrate/d86adae2a73465ef8852a1f01de4231c.png)
运行:
![](https://i-blog.csdnimg.cn/blog_migrate/41cd3ac1b66172241ee767c625c700f4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d0b508afb5b4dfb32020d5fc1728d8f9.png)
分开理解:
结构体定义时不能定义自身结构体变量
![](https://i-blog.csdnimg.cn/blog_migrate/e052df32378c71c04b009812a1b9b769.png)
编译:
![](https://i-blog.csdnimg.cn/blog_migrate/e50668d6141391422aa637dfc4701dd7.png)
但可以定义自身的指针:
![](https://i-blog.csdnimg.cn/blog_migrate/23979b18153da142eddf6404089c8010.png)
编译:
![](https://i-blog.csdnimg.cn/blog_migrate/27704a2078fb63b9276e9143153e49b8.png)
好了,今天的内容学到这,下次再见!!