数组指针作为形参传递

原文链接:https://blog.csdn.net/yhl_jxy/article/details/77145439

当数组作为函数形参时,数组的地址可以用做函数调用的实参。

可以通过数组地址的传递,在函数内可以对该数组进行访问和修改。

eg:

#include <stdio.h>
#define SIZE 10
 
/* 形式1 */
void func_1(const char a[SIZE]) {
    printf("获取数组的第一个元素=%c\n", a[0]);
    printf("char a[SIZE]: %d\n", sizeof(a));/* 输出形参的字节长度 */
}
 
void func_2(const char a[10000]) {/* 数组容量是否符合,不影响形参传递 */
    printf("获取数组的第一个元素=%c\n", a[0]);
    printf("char a[10000]: %d\n", sizeof(a));/* 输出形参的字节长度 */
}
/* 形式2 */
void func_3(const char a[]) {
    printf("获取数组的第一个元素=%c\n", a[0]);
    printf("char a[]: %d\n", sizeof(a));/* 输出形参的字节长度 */
}
/* 形式3 */
void func_4(const char * a) {
    printf("获取数组的第一个元素=%c\n", a[0]);
    printf("char * a: %d\n", sizeof(a));/* 输出形参的字节长度 */
}
 
/*
    测试数组的形参传递:
    以上三种形式传递一位数组形参,对于编译器来说,
    最后都处理为char型指针,实质上都是一样的。
    写成形式1可以提高程序的可读性。
 */
int main(void){
    char a_char[SIZE] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
    char * p_char = a_char;
 
    /* 函数调用 */
    func_1(a_char);
    func_2(p_char);
    func_3(a_char);
    func_4(p_char);
}

运行结果:
《数组指针作为形参传递》

以上还只是访问,如果想在函数里面修改数组,或者指针指向的内容时,需要去掉c++中的·const限制,如下:

#include <stdio.h>
#define SIZE 10

/* 形式1 */
void func_1(char a[SIZE]) {
	printf("获取数组的第一个元素=%c\n", a[0]);
	a[0] = 'c';
	printf("char a[SIZE]: %d\n", sizeof(a));/* 输出形参的字节长度 */
}

void func_2(char a[10000]) {/* 数组容量是否符合,不影响形参传递 */
	printf("获取数组的第一个元素=%c\n", a[0]);
	a[0] = 'l';
	printf("char a[10000]: %d\n", sizeof(a));/* 输出形参的字节长度 */
}
/* 形式2 */
void func_3(const char a[]) {
	printf("获取数组的第一个元素=%c\n", a[0]);
	printf("char a[]: %d\n", sizeof(a));/* 输出形参的字节长度 */
}
/* 形式3 */
void func_4(const char * a) {
	printf("获取数组的第一个元素=%c\n", a[0]);
	printf("char * a: %d\n", sizeof(a));/* 输出形参的字节长度 */
}

/*
测试数组的形参传递:
以上三种形式传递一位数组形参,对于编译器来说,
最后都处理为char型指针,实质上都是一样的。
写成形式1可以提高程序的可读性。
*/
int main(void) {
	char a_char[SIZE] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' };
	a_char[0] = 'z';
	char * p_char = a_char;

	/* 函数调用 */
	func_1(a_char);
	func_2(p_char);
	func_3(a_char);
	func_4(p_char);

}

运行结果:
《数组指针作为形参传递》
上面的例子中,其实你还以随意组合指针与数组作为参数传递,只要等级一样,都可以正常运行。比如:

func_1(p_char);
func_2(p_char);
func_3(p_char);
func_4(p_char);

在此,我还想奉上几句话,或者几个案例,以便加深理解。如下:

关于C语言中函数传入指针来修改指针指向的内容的问题

以前自己的理解是如果想让函数修改传入变量的值,就是要给函数传入指向这个变量的指针的。
但是我在递归创建二叉树的时候,定义结构体时已经有了结构体指针,教程里写的是给创建函数传入了指向这个结构体指针的指针,为什么这里要传入二级指针呢?按照我以前的理解,传入结构体指针就可以改变结构体的值了。

如果只是要改变指针指向的值, 那么传入结构体指针即可。
传入二级指针,一般是要在函数内分配内存, 也就是改变指针本身的指向。
比如 struct A *p; 函数参数设置为struct A **q; 传入&p
在函数中有类似于*q=xxxx;这样的调用的情况。
追问
也就是说,如果只是要改变指针指向的值,用一级指针即可,如果要改变它指向的地址,就比如二叉树的创建过程中生成新结点的过程,就是要用二级指针了是吧?
追答
是的。 
更扩展来说, 要在函数中,通过参数传回类型为T的值, 那么就要用T*来做参数。 
如果T是int, 那么参数int*
如果T是int *, 那么参数是int**
如果T是int **, 那么参数就是int ***
。。。

c++,函数里形参是指针,在函数里改变指针所指向的地址时,主函数里实参地址是不会改变的,那如果我想改变它该怎么办

例如:

void ff(Bitnode *x,Bitnode *bt)
{
x=bt;
}
int main
{
myclass b;//maclass 是我自己写的一个类

myclass *c;

ff(c,&b);

}

这样写的话主函数里的c指针地址不会变

网友1:
把指针的地址传过去

void ff(Bitnode **x,Bitnode *bt)
{
*x=bt;
}
int main
{
myclass b;//maclass 是我自己写的一个类
myclass *c;
ff(&c,&b);
}

网友2:
楼主你好
用c++的引用吧
void ff(Bitnode *&x,Bitnode *bt)//改成引用
{
x=bt;
}
希望能帮助你哈

网友3:
用二级指针,将函数改为下面的形式:

void ff(Bitnode **x,Bitnode *bt)
{
*x=bt;
}

调用时用ff(&c,&b);

网友4:
用二级指针 **c; 传参数的时候传*c就好了

网友5:
引用传递的是内存的别名,引用不占用内存 ,指针传递的是某一块内存的地址,而指针本身也是需要内存存储的 ,所以如果你想在函数里改变内存的内容传递内存的引用就行了

关于C语言数组作为函数的实参和形参的问题
关于C语言数组作为函数的实参和形参的问题如图,我将数组mark全部赋值,然后将它的值传递给函数的形参。程序没有问题,但我的问题是:函数的实参是mark?mark不是首地址吗,它是如何把所有10个元素的值赋给形参score[10]的?然后还有一个问题,形参是一个数组我该怎么理解?相当于定义这个函数中有10个没有值的参数等待赋值?

《数组指针作为形参传递》
网友1:
个人觉得, 形参和实参这种叫法让人摸不着头脑
调用子函数时实际上是把数组的首地址传递给子函数, 子函数中的参数score这个变量得到这个地址, 就这么简单

网友2:
函数传递数组的话,其实传递收地地址就好,把数组首地址传给函数的形参(这个形参务必定义为对应类型的指针),形参可以以指针的形式访问数组的内容,也可以直接用数组的方式访问

网友3:
你可以把数组形参改成指针形参试试

更多请参考:
https://blog.csdn.net/yhl_jxy/article/details/77145439
https://www.cnblogs.com/qquan/articles/4940043.html
https://www.cnblogs.com/li-peng/p/4116349.html

    原文作者:edward_zcl
    原文地址: https://blog.csdn.net/edward_zcl/article/details/89345096
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞