重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
情况1 需要读入的数据是比较大的数据,使用指针作为参数可以节省堆栈
网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了邯郸免费建站欢迎大家使用!
比如 定义1个结构体
typedef struct test
{
char buffer1[10000];
char buffer2[10000];
//后面还有一大堆成员
}test_ts;
void Func1(test_ts t1)
{
//函数体是对t1成员进行Read处理
}
void Func2(test_ts *t1)
{
//函数体是对t1成员进行Read处理
}
上面2个函数功能其实一样,但函数Func2参数只是一个指针占的空间就4 Byte,
Func1参数是一个结构体,占的空间就看成员多少,但例子的使用的堆栈最少20000Byte了。
情况2 需要对数据进行改写
一般对应的数据是数组或结构体数据。
比如memset函数函数,用于把传入指针的数据写入对应的数据。
具体函数体内容不贴了,baidu查下吧。
例如还是这个结构体test_ts
test_ts t2;
如果需要将t2的每个成员初始化成0,可以把每个成员挨个赋值成0。
但如果用下面这样代码
memset(t2,0,sizeof(t2));
一行搞定
简单来说就是当你想灵活地访问地址空间,并在不需要时将其释放时,就可以考虑用指针。使用指针可以灵活地对地址空间进行操作,但是带来方便的同时也经常出现灾难性的软件问题。使用时要特别注意,任何时间使用指针都要保证指向正确的地址空间,它的内容至少在一定范围内是“可预测的”。
1.什么时候都可以用指针,因为用指针的效率比用变量高。
2.当一个函数要返回1个以上的运算结果时,就必须用指针,因为一个函数只能返回一个值,更多的得用指针“带回”。
3.操作数组时,用指针不仅方便得多而且代码时效很高。
4.操作文件时,不用指针寸步难行。
5.利用指针可以简化函数调用的书写过程,使源代码易于阅读。
……不一而论。
任何时候都可以使用数组,使用指针。
定义时,通常只有字符指针,和字符数组指针直接定义。用来表示字符串或字符串数组。
其他一般定义数组。操作时用指针或数组。
其他指针,多半用在参数传递,数据结构内部(不确定需要内存的大小,或者链表,二叉树等链式结构)的时候。
还有一种是有些函数参数就是指针,这时定义一个指针,来操作传进来的指针参数比较好。
指针作为参数,有一下几种用法,
1)当作数组用,用来获取或设置数组元素。
2)把一个比较长的数据结构传入函数,只需要一个指针就够了。
3)传入变量的地址,用来读取或修改变量的值,主要是为了修改用。
直接定义一个不指向任何对象的指针,并且也从不给他赋值,没什么意义;
指针要么指向数组,要么指向变量,要么动态申请内存。
NULL指针,只是一个方便的指针,表示不指向任何对象。
真正有用的还是指向具体对象的指针。
如果定义了一个指针,使用时要让他指向一个具体对象,当需要他不指向什么对象的时候,给他赋值为NULL;
PS:
C语言,数组名只是一个指针常量而已,离开定义可见处,数组大小的信息就不存在了。
只有定义完全可见的地方,才可以获得数组的大小。
数组作为函数的参数,和外部引用声明都不能获得数组的大小。
参数只能传递指针,参数的大小只是指针的大小;
只能看到声明的地方,获取数组大小的努力,只能换来错误。
void fun1(int a[10]) //== void fun1(int a[]) ==void fun1(int *a)
{
}
void fun2(int [10][10])// ==void fun2(int a[][10])== void fun2(int (*a)[10])
{
}
1. 需要改变实参的时候, 只能用指针.
2. 传递大型结构并且"只读"其元素的时候,
因为大型结构通过值传递, 需要拷贝其每个元素, 这样效率太低.
3. 需要遍历数组或频繁引用其元素时, 这样效率比使用下标高.
4. 动态分配空间时, 必须使用指针.
5. 传递数组时, 必须使用指针.
6. 函数返回指针时, 比如fopen
这是经验和技巧的问题, 多写点代码吧:)