我很难弄清楚发生了什么,我以为 C 是按值传递的,但这个简单的函数让我对它的工作方式感到困惑。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void testFunc(char string1[])
{
char string2[50] = "the end";
strcat(string1, string2);
printf("in func %s n", string1);
}
void main()
{
char string1[50] = "the start";
printf("%IN MAIN %s n", string1);
testFunc(string1);
printf("IN MAIN %s n", string1);
}
令人困惑的是,输出是:
在主要开始
In FUNC THESTARTTHEEND
在主要开始结束
这到底是怎么回事呢?C 真的传递 char 数组的地址而不是复制它的值吗?我以为这就是char*
的行为方式,不会char[]
不能将数组的副本传递给函数。使用数组名称时,它的计算结果为指向 1 的指针。元素(或者像通常所说的那样,它衰减为指针。除了在 sizeof
和 &
运算符中使用数组名称外,这种情况在所有地方都会发生。
因此,您将指向数组的 1. 元素的指针传递给您的testFunc()
testFunc(string1);
和做一模一样
testFunc(&string1[0]);
此外,在函数参数列表中,char[]
实际上意味着char *
这 3 个声明完全相同
void testFunc(char *string1);
void testFunc(char string1[]);
void testFunc(char string[111]);
如果不想更改传入的字符串,请使用以下内容:
例如
void testFunc(char string1[])
{
char string2[50];
const char *end = "the end";
strcpy(string2, string1);
strcat(string2, end);
(并且在使用 strcpy/strcat 时保持清醒,
C 总是按值传递参数,但与其他数组一样,字符串被转换为指向其第一个元素的指针,然后传递该指针。按价值。
它按值传递。
string1
是char
数组起始位置的地址,并且正在传递此值。
和
void testFunc(char string1[])
与
void testFunc(char *string1)
在函数参数的情况下,如果你写:-
void testFunc(char string1[])
{
//body
}
或
void testFunc(char *string1)
{
//body
}
事实上,在 C 中,第一个总是转换为第二种类型的函数定义。所以万一函数参数N element array of type T
转换成Array of type T
,记住它,享受C编程。
请注意,这仅在函数参数的情况下发生。