参数的地址是可以修改的,修改后的地址是不可能传回给调用处的指针变量。也就是说,可以修改参数地址所指的单元的值,这是可以传回到调用处的变量里面的。

#include <stdio.h>
#include <stdlib.h>
#include <string.h> int subFunc(int arr[3]); //交换两整数
void change(int *data1, int *data2) {
int *temp; //交换两数的地址
temp = data1;
data1 = data2; //修改参数1的地址
data2 = temp; //修改参数2的地址 //交换后的地址在函数内没问题,但不能传回主程序
printf("change:data1=%d, data2=%d\n", *data1, *data2); return ;
} //动态获得内存 //| //改为如下内容便可以传回主程序
void getMemory(int size, char *str) { //| char *getMemory(int size) {
//动态分配的内存地址赋给str //|
str = (char *)malloc(size); //| return (char *)malloc(size);
//|
return ; //| }
} //|
//| //主程序的调用也得改成: p = getMemory(40) ;
int main(void)
{
int x = 25, y = 87 ; change(&x, &y);
printf("main:x=%d, y=%d\n", x, y); //x,y未得到交换 getMemory(40, p); //p未得到内存
strcpy(p, "这是小雅的C语言教程"); //这句有错,注释之后才能得到上图结果
free(p) ; return 0;
} 二、用局部变量的地址作返回值
这是初学者常犯的错误。小雅在开始做这个例子时,没有用数组,而是用整型变量,结果令我大吃一惊,不管怎么试,结果全是正确的。可小雅明明知道这程序是有毛病的,为什么不出错呢?任何事都经不起琢磨,终于明白了其中的原因,但在这儿不能说,不是小雅卖关子,是因为说了反让初学者糊涂。 #include <stdio.h> int *setData(void) {
int arr[3] ; //| static int arr[3] ; arr[0] = 10 ;
arr[1] = 35 ;
arr[2] = 48 ; return arr ; //局部变量随函数结束而消亡,因此,返回之后是不正确的
} int main(void)
{
int i ;
int *rst ; rst = setData();
for (i=0; i<3; i++) {
printf("%3d\n", rst[i]);
} return 0;
}
上面的错误是将消亡的地址返回,修正的方法可以考虑2种,一是将函数中的数组改为静态的。另一种办法是再动态申请内存。这样修改之后固然正确,但如果主程序中的rst改为数组,结果又怎样呢?这将导致编译错误。因为数组的地址不能被修改。
三、双重指针作参数
上面第一个例子讲到,不能把指针的地址传给调用处的变量,但实际编程时的确有这种需求,希望调用一个函数,使得原来的空指针变成有数据内容的指针。
这其实不难实现,大家只要比较一下以前讲到的基本类型(譬如int)作参数时,不能通过参数返回内容,我们就改成“int *”这样的指针类型作参数,从而解决这个问题。现在我们只要用双重指针便同样可以解决指针的地址传送的问题。但要注意:“int *”作参数,调用时用“&变量”;“int **”作参数,调用时用“&指针变量”。 #include <stdio.h>
#include <stdlib.h> void setData(int **ptr) {
int *p = (int *)malloc(3 * sizeof(int)); p[0] = 10, p[1] = 35, p[2] = 48 ;
*ptr = p; //注意:是将申请的内存地址赋给*ptr return ;
} int main(void)
{
int i ;
int *data = NULL ; //这句有错,应该用指针变量data的地址作参数
setData(data); //| setData(&data); for (i=0; i<3; i++) {
printf("%3d\n", data[i]);
} return 0;
}

c指针参数常见错误的更多相关文章

  1. C++学习之指针的常见错误

    C++学习之指针的常见错误       我们在编程的过程中,有时候在使用指针的时候,删除一个指针以后一定要将这个指针设置为空指针,这是因为删除这个指针只是删除这个指针指向的地址,这个指针还真是的存在程 ...

  2. 深入理解C语言 - 指针使用的常见错误

    在C语言中,指针的重要性不言而喻,但在很多时候指针又被认为是一把双刃剑.一方面,指针是构建数据结构和操作内存的精确而高效的工具.另一方面,它们又很容易误用,从而产生不可预知的软件bug.下面总结一下指 ...

  3. Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值

    Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇 ...

  4. SpringMVC接受JSON参数详解及常见错误总结我改

    SpringMVC接受JSON参数详解及常见错误总结 最近一段时间不想使用Session了,想感受一下Token这样比较安全,稳健的方式,顺便写一个统一的接口给浏览器还有APP.所以把一个练手项目的前 ...

  5. SpringMVC接受JSON参数详解及常见错误总结

    SpringMVC接受JSON参数详解及常见错误总结 SpringMVC接受JSON参数详解及常见错误总结 最近一段时间不想使用Session了,想感受一下Token这样比较安全,稳健的方式,顺便写一 ...

  6. libsvm的安装,数据格式,常见错误,grid.py参数选择,c-SVC过程,libsvm参数解释,svm训练数据,libsvm的使用详解,SVM核函数的选择

    直接conda install libsvm安装的不完整,缺几个.py文件. 第一种安装方法: 下载:http://www.csie.ntu.edu.tw/~cjlin/cgi-bin/libsvm. ...

  7. 【转】C++常见错误大全

    原文转自:http://hi.baidu.com/qiou2719/item/b9eed949130ff50ec0161331 C++常见错误大全 0. XXXX "is not a cla ...

  8. C语言常见错误中英文对照表

    C语言常见错误中英文对照表(网络搜索及经验积累不断更新中) 常见错误中英文对照表 fatal error C1003:  error count exceeds number; stopping co ...

  9. GO 新开发者要注意的陷阱和常见错误

    转自:http://colobu.com/2015/09/07/gotchas-and-common-mistakes-in-go-golang/ 初级 开大括号不能放在单独的一行 未使用的变量 未使 ...

随机推荐

  1. BZOJ 1624 [Usaco2008 Open] Clear And Present Danger 寻宝之路:floyd

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1624 题意: 农夫约翰正驾驶一条小艇在牛勒比海上航行. 海上有N(1≤N≤100)个岛屿, ...

  2. web.xml 有什么用?

    1.每个javaEE工程中都有web.xml文件,那么它的作用是什么呢?它是每个web.xml工程都必须的吗? 一个web中可以没有web.xml文件,也就是说,web.xml文件并不是web工程必须 ...

  3. C语言中数组做函数参数的问题

    数组做函数参数,会退化成为一个指针变量.因此在进行数组参数传递的同时,需要传递一个数组长度的参数变量. 数组长度可以通过sizeof(arr)/siezof(arr[0])来得到.关于这个sizeof ...

  4. python+Django实现Nagios自动化添加监控项目

    最近机房刚上了一批机器(有100台左右),需要使用Nagios对这一批机器进行监控.领导要求两天时间完成所有主机的监控.从原来的经验来看,两天时间肯定完成不了.那怎么办?按照之前的想法,肯定是在nag ...

  5. 「ZJOI2007」「LuoguP1169」棋盘制作(并查集

    题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8×88 \times 88×8大小的黑白相间的方阵,对应八八六十四卦 ...

  6. webstorm怎样查找历史记录

    在webstorm中 文件界面右键,local History --> show History 上面能看到具体的日期和编写的代码. 如果想回到某一次的代码.把中间的代码按>>移入到 ...

  7. .net网站部署时错误——未能加载文件或程序集(Could not load file or assembly)——的解决

    Could not load file or assembly 'System.Web.Http.WebHost, Version=4.0.0.0, Culture=neutral, PublicKe ...

  8. C# HTML解析工具HtmlAgilityPack使用实例(一)

    一.生成HTML字符串 //生成DOM字符串结构 HtmlNode container = HtmlNode.CreateNode("<div />"); HtmlNo ...

  9. EF之贪婪加载和延迟加载

    这篇文章将讨论查询结果的控制 在使用EF(Entity Framework)的过程中,很多时候我们会进行查询的操作,因此知道哪些数据会被加载到内存当中就至关重要.在多多的情况下,你可能并并不需要加载全 ...

  10. g2o待总结

    http://blog.csdn.net/u010566411/article/details/53862601