参数传递之指针传递
2006-03-20 18:24
78 查看
(1)基础知识
C课本上的一个程序:
void swap(int *p1,int *p2)
{
int t=*p1;
*p1=*p2;
*p2=t;
}
void main()
{
int a=1,b=2;
swap(&a,&b);
...
}
a,b的值交换了是因为a,b的地址被传递给了函数swap,使得p1=&a,p2=&b。
为了看得更清楚些,更改一些:
void swap(int *p1,int *p2)
{
int t=*p1;
*p1=*p2;
*p2=t;
}
void main()
{
int a=1,b=2;
int *pa=&a,*pb=&b;
swap(pa,pb);
...
}
在上面,pa,pb是形参,p1,p2是实参。pa=&a,p1=&a;pb=&b,p2=&b。但pa与p1不是同一个内存区域的指针,pb与p2也一样。
(2)问题
再看一个程序:
为程序分配内存区域,你可以这样做:
#define SIZE 100
void main()
{
int *p;
p=(int *)malloc(SIZE*sizeof(int)); //malloc为指针p分配内存
...
}
不能这样做:
#define SIZE 100
int my_malloc(int *q);
void main()
{
int *p;
my_malloc(p);
...
}
int my_malloc(int *q)
{
q=(int *)malloc(SIZE*sizeof(int)); //malloc为指针q分配内存
}
因为当p作为形参传递时,只是传递p的地址给q,即p,q是两个指向相同地址的两个不同指针。在my_malloc函数中只是为q分配内存区域,并不是为p分配。
(3)
解决办法将指针传递给要调用的函数
#define SIZE 100
int my_malloc(int *q);
void main()
{
int *p;
my_malloc(&p); //传递指针p的地址给**p
...
}
int my_malloc(int **q) //**q是指向指针p的一个指针
{
*q=(int *)malloc(SIZE*sizeof(int));
}
如果你用的是C++,你还可以用引用"&"的办法:
#define SIZE 100
int my_malloc(int *q);
void main()
{
int *p;
my_malloc(p);
...
}
int my_malloc(int *&q) //*q是指针p的一个引用
{
q=(int *)malloc(SIZE*sizeof(int));
}
--------------------------------------------------------------------
传递指针在函数中分配内存的危险的,上面的程序只是传递指针一个例子。
C课本上的一个程序:
void swap(int *p1,int *p2)
{
int t=*p1;
*p1=*p2;
*p2=t;
}
void main()
{
int a=1,b=2;
swap(&a,&b);
...
}
a,b的值交换了是因为a,b的地址被传递给了函数swap,使得p1=&a,p2=&b。
为了看得更清楚些,更改一些:
void swap(int *p1,int *p2)
{
int t=*p1;
*p1=*p2;
*p2=t;
}
void main()
{
int a=1,b=2;
int *pa=&a,*pb=&b;
swap(pa,pb);
...
}
在上面,pa,pb是形参,p1,p2是实参。pa=&a,p1=&a;pb=&b,p2=&b。但pa与p1不是同一个内存区域的指针,pb与p2也一样。
(2)问题
再看一个程序:
为程序分配内存区域,你可以这样做:
#define SIZE 100
void main()
{
int *p;
p=(int *)malloc(SIZE*sizeof(int)); //malloc为指针p分配内存
...
}
不能这样做:
#define SIZE 100
int my_malloc(int *q);
void main()
{
int *p;
my_malloc(p);
...
}
int my_malloc(int *q)
{
q=(int *)malloc(SIZE*sizeof(int)); //malloc为指针q分配内存
}
因为当p作为形参传递时,只是传递p的地址给q,即p,q是两个指向相同地址的两个不同指针。在my_malloc函数中只是为q分配内存区域,并不是为p分配。
(3)
解决办法将指针传递给要调用的函数
#define SIZE 100
int my_malloc(int *q);
void main()
{
int *p;
my_malloc(&p); //传递指针p的地址给**p
...
}
int my_malloc(int **q) //**q是指向指针p的一个指针
{
*q=(int *)malloc(SIZE*sizeof(int));
}
如果你用的是C++,你还可以用引用"&"的办法:
#define SIZE 100
int my_malloc(int *q);
void main()
{
int *p;
my_malloc(p);
...
}
int my_malloc(int *&q) //*q是指针p的一个引用
{
q=(int *)malloc(SIZE*sizeof(int));
}
--------------------------------------------------------------------
传递指针在函数中分配内存的危险的,上面的程序只是传递指针一个例子。
相关文章推荐
- (转)二叉树算法引发的思考:指针参数传递、引用的陷阱
- pthread_create 参数传递指针问题
- 指针作为函数的参数传递的问题
- 指针作为函数参数传递 (转载)
- 函数的结构体指针参数传递的问题 都忘完了
- 如何在C函数中传递指向二维数组的指针参数
- win消息传递参数尽量不要传指针
- 指针作为函数参数传递
- C语言中,数组名作为参数传递给函数时,退化为指针
- 函数的参数传递的几种形式(值、地址、引用)及指针基础知识
- 图解C/C++中函数参数的值传递、指针传递与引用传递
- C#处理VC++动态库回调函数的字符串指针参数(传递二进制流)
- C# 调用Dll 传递字符串指针参数
- 指针作为函数参数传递
- 指针参数传递内存的方法
- c#调用C++写的DLL,传递二维指针参数
- C++引用(3) - 使用引用或者指针传递参数
- 函数参数的传递问题(一级指针和二级指针)
- (转载) C语言技巧:怎样把数组作为参数传递给函数?(值传递和指针传递)
- c++之指针作为函数参数传递的问题