今天继续对于C语言的指针进行学习,话不多说,进入正题。
数组作为参数传递【指针传递】:
下面通过一系列程序来说明数组作为参数传递是属于指针传弟:
一维数组:
![](https://i-blog.csdnimg.cn/blog_migrate/36da4b0ca98f89a0c807579eb40b3079.png)
编译运行,看结果:
![](https://i-blog.csdnimg.cn/blog_migrate/a24bccdf8a585a22f51f511cebf12429.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c8cc689d10318a2c8128c721601e2594.png)
编译运行:
![](https://i-blog.csdnimg.cn/blog_migrate/231085b5c86e6f87685f9f21446dcbb0.png)
我们知道
“数组定义之后,它的首地址是无法重新指向新地址的”,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/fad1519ec6a97c1df0bc3496162f5a0f.png)
编译:
![](https://i-blog.csdnimg.cn/blog_migrate/ee0fbec6c055dfaa0658f7c45cdc2348.png)
而请看如下情况:
![](https://i-blog.csdnimg.cn/blog_migrate/d34478328fef8148c300ce1b8b034b7e.png)
编译运行:
![](https://i-blog.csdnimg.cn/blog_migrate/61985b33c1d8040edf0138f62ae790d5.png)
说明:当一维数组作为函数参数时,有三种写法都等价,都是int*a
![](https://i-blog.csdnimg.cn/blog_migrate/e547a75a60dbd49a40aeec9ae9a68d21.png)
二维数组:
![](https://i-blog.csdnimg.cn/blog_migrate/e72477692a678ad516aa14bc09f21d6b.png)
编译:
![](https://i-blog.csdnimg.cn/blog_migrate/b034027cab6f9b1492f3f75c50012e85.png)
如果
省略了二维数会怎样呢?
![](https://i-blog.csdnimg.cn/blog_migrate/d7e8bd6b75ada77abd70cf5a3eda4306.png)
编译:
![](https://i-blog.csdnimg.cn/blog_migrate/679d52adb244ee025cffcd0c7577dccf.png)
说明:
![](https://i-blog.csdnimg.cn/blog_migrate/d58b5cf02da5301ec73346c6abd86999.png)
命令行参数:
![](https://i-blog.csdnimg.cn/blog_migrate/1bf3dc283e42f3cdc59edaf8f0dd8284.png)
main函数是程序的入口函数,今天来对其参数进行研究,先通过程序来直观的感受下:
![](https://i-blog.csdnimg.cn/blog_migrate/e77662021218373c86e2e99f219d4270.png)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/99cff828f6f30dfb7641fc47e603f87d.png)
分析一下内存模型:
![](https://i-blog.csdnimg.cn/blog_migrate/dc7ad671fbba37c9d95de7dbfa8afd09.png)
所以,可以通过循环,将命令行的所有参数都打印出来:
![](https://i-blog.csdnimg.cn/blog_migrate/a9be58c68cf684a143c6398f73679026.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fb34211ef84be0638662a2c562e8c030.png)
对于上面的程序,也能用指针的指针来代替,两种方式是等价的:
![](https://i-blog.csdnimg.cn/blog_migrate/070d77609b2cf8b2eda37dbbca2eb5e3.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/127ff645e2aaf74c21a2a644aaa63a8f.png)
结构体指针:
![](https://i-blog.csdnimg.cn/blog_migrate/1646cc8114bcbfeecb1e17e6754264ab.png)
下面通过代码来进行说明:
![](https://i-blog.csdnimg.cn/blog_migrate/f5dbaffa706bc964d071398340942cb3.png)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/777fcfef54b4cc160fd6fd0e20854f63.png)
从运行结果上来看,
貌似跟理解有点违背,事实上上面的输出0是不确定的,但是为了
确保malloc分配的结构体成员被初始为0,需用到memset函数,用man查看下:
![](https://i-blog.csdnimg.cn/blog_migrate/58c73cbd1fd04a627f49a13aa3d41f04.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f2c0b2be3732babd1f392eafc7e061b5.png)
注意:malloc分配的内存,是没有设置的,对于这个结构体,也就是里面的成员都是没有初始化的,这时可用memset函数进行初始化
![](https://i-blog.csdnimg.cn/blog_migrate/5fb886a022359963cf33ff1698c6ce3f.png)
其实对于上面这个,可用一个函数来代替:calloc,查看man帮助:
![](https://i-blog.csdnimg.cn/blog_migrate/4cacfdd4d36ccf5742c547f9a4ae7b0f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/54fb38d34597a11c67cceb22c6c7dfe0.png)
从上面帮助来看,calloc=malloc+memset
![](https://i-blog.csdnimg.cn/blog_migrate/eab709901c1badb9856c4c5ad7c79551.png)
运行结果一样:
![](https://i-blog.csdnimg.cn/blog_migrate/ef20afb3b82d2ec765df4c0df0f30ded.png)
下面介绍一下内存拷贝函数:memcpy
![](https://i-blog.csdnimg.cn/blog_migrate/3dc48d26c9ad908946a9716046462b68.png)
看具体使用:
![](https://i-blog.csdnimg.cn/blog_migrate/d4f5611c781e4882d0fa87026bae0874.png)
运行:
![](https://i-blog.csdnimg.cn/blog_migrate/5545ccf871921227892a7a372de6b1df.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8759c0fa4f67ceab551fd9103ef1fd34.png)
分开理解:
结构体定义时不能定义自身结构体变量
![](https://i-blog.csdnimg.cn/blog_migrate/b6f597383fb01ec99621971ea2fbb916.png)
编译:
![](https://i-blog.csdnimg.cn/blog_migrate/884bfffc301982621c7938fed8c972dd.png)
但可以定义自身的指针:
![](https://i-blog.csdnimg.cn/blog_migrate/8cfea37e7a5cc5d12f8946f772d5103f.png)
编译:
![](https://i-blog.csdnimg.cn/blog_migrate/3eddc1c6f146103f6cb3da205eeeb258.png)
好了,今天的内容学到这,下次再见!!