行指针作为函数参数,指针作为函数参数的传参过程
C语言中 指针做函数参数传递二维数组
C语言中
指针做函数参数传递二维数组有两种基本方法:
1、传递“数组指针”
#include stdio.h
void output( int (*pa)[3], int n )//这个函数只能输出n行3列的二维数组
{
int i,j;
for( i=0;in;i++ ){
for( j=0;j3;j++ )
printf("%d ", pa[i][j] );
printf("\n");
}
}
void main()
{
int a[2][3]={
{1,2,3},
{4,5,6}
};
output(a,2);
}
2、传递“指针数组”
先将二维数组的行指针存储到一个指针数组中,再将指针数组传递到子函数中去。
#include stdio.h
void output( int *pa[], int row,int col ) //这个函数更通用,但调用前,要做好准备工作。
{
int i,j;
for( i=0;irow;i++ ){
for( j=0;jcol;j++ )
printf("%d ", pa[i][j] );
printf("\n");
}
}
void main()
{
int a[2][3]={
{1,2,3},
{4,5,6}
};
int i;
int *pa[2];
for( i=0;i2;i++ )
pa[i]=a[i];
output(pa, 2, 3);
}
用指针变量作为函数参数
在C语言中,函数的参数不仅可以是整数、小数、字符等具体的数据,还可以是指向它们的指针。用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁。
像数组、字符串、动态分配的内存等都是一系列数据的集合,没有办法通过一个参数全部传入函数内部,只能传递它们的指针,在函数内部通过指针来影响这些数据集合。
有的时候,对于整数、小数、字符等基本类型数据的操作也必须要借助指针,一个典型的例子就是交换两个变量的值。
调用 swap() 函数时,将变量 a、b 的地址分别赋值给 p1、p2,这样 *p1、*p2 代表的就是变量 a、b 本身,交换 *p1、*p2 的值也就是交换 a、b 的值。
函数运行结束后虽然会将 p1、p2 销毁,但它对外部 a、b 造成的影响是“持久化”的,不会随着函数的结束而“恢复原样”。
需要注意的是临时变量 temp,它的作用特别重要,因为执行*p1 = *p2;语句后 a 的值会被 b 的值覆盖,如果不先将 a 的值保存起来以后就找不到了。
扩展资料:
用数组作函数参数:
数组是一系列数据的集合,无法通过参数将它们一次性传递到函数内部,如果希望在函数内部操作数组,必须传递数组指针。
参数 intArr 仅仅是一个数组指针,在函数内部无法通过这个指针获得数组长度,必须将数组长度作为函数参数传递到函数内部。
数组 nums 的每个元素都是整数,scanf() 在读取用户输入的整数时,要求给出存储它的内存的地址,nums+i就是第 i 个数组元素的地址。
c++利用指针做函数参数
#includestdio.h
int code(char *str,char *p)
{int n=0;
for(;*str;str++)
if(*str==*p)
{*str='*';
n++;
}
return n;
}
int main()
{ char s[]="succese",c='s';
int n;
n=code(s,c);
printf("%s\n%d\n\n",s,n);
}
编写一个用指针作为参数的函数,并用它实现统计字符串的长度
既然这是统计字符串的长度,那么就应该是要处理多个字符串吧?
/*
getStringsLen函数功能:统计字符串的长度;
参数意义:
1、char (*str)[80],数组指针,说白了,就是与实参对应的,能够操作二维数组的行指针;当然,也就是说实参必须是二维数组,或者对应的行指针;
2、stringCount,字符串数组中的字符串个数;
3、int *strLen,用户传递的,用以存储字符串长度的数组。
*/
void getStringsLen(char (*str)[80], int stringCount, int *strLen);
void getStringsLen(char (*str)[80], int stringCount, int *strLen)
{
int i;
for(i = 0; i stringCount; i++)
strLen[i] = strlen(str[i]);
// strlen()是函数,求字符串的长度。
}
在c语言中,指针作为函数参数,形参只能传递值,而不能传递地址,是怎么回事?
C语言中,函数参数只能传值。与传值对应的是传引用,C语言不支持函数参数传引用,C++语言才支持。
C++传引用函数:
void foo(int a) { a = 3; }
假如a = 2,执行foo(a)后,a = 3。
---
C语言可以模拟传引用,方法是通过指针来实现:
void foo2(int* ap) { *ap = 3; }
假如a = 2,执行foo2(a)后,a = 3
foo2(a)调用本质上仍然是传值,只不过传递的是指针,指针即是地址,地址本质上是一个无符号整数。
如果:
void foo3(int b) { b = 3; }
假如a = 2,执行foo3(a)后,a = 2。这是因为foo3(a)调用过程中,a值传给形参b,修改b的值与实参a无关。
注意到,foo3(a)与上述foo(a)传引用的调用是形式一样的。
既然C语言通过指针可以实现传引用调用,为什么C++还要引入引用这个特性呢?这是因为C++引入的很多新特性需借助引用来实现,比如,拷贝构造函数等等。