行指针作为函数参数,指针作为函数参数的传参过程

http://www.itjxue.com  2023-01-04 17:10  来源:未知  点击次数: 

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++引入的很多新特性需借助引用来实现,比如,拷贝构造函数等等。

(责任编辑:IT教学网)

更多

推荐Freehand教程文章