我无法弄清楚发生了什么,我认为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 MAIN thestart
IN FUNC thestarttheend
主要开始了
那么这里发生了什么? C是否真的传递了char数组的地址而不是复制它的值?我认为char*
的行为不是char[]
答案 0 :(得分:8)
您无法将数组的副本传递给函数。当您使用数组的名称时,它将计算为指向数组中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]);
如果您不想更改传入的字符串,请使用以下内容:
e.g。
void testFunc(char string1[])
{
char string2[50];
const char *end = "the end";
strcpy(string2, string1);
strcat(string2, end);
(使用strcpy / strcat时会很清醒,很容易溢出数组这样做)
答案 1 :(得分:4)
C总是按值传递参数,但字符串与其他数组一样,将转换为指向其第一个元素的指针,然后传递该指针。按价值。
答案 2 :(得分:3)
它正在传递价值。
string1
是char
数组起始位置的地址,正在传递此值。
和
void testFunc(char string1[])
与
相同void testFunc(char *string1)
答案 3 :(得分:1)
如果你写了函数参数,那么它是等价的: -
void testFunc(char string1[])
{
//body
}
或
void testFunc(char *string1)
{
//body
}
实际上在C中,第一个总是被转换为第二类函数defination。因此,如果函数参数N element array of type T
被转换为Array of type T
,请记住它并享受C编程。
注意这仅在函数参数的情况下发生。