C 字符串函数调用,按值或引用传递



我很难弄清楚发生了什么,我以为 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 总是按值传递参数,但与其他数组一样,字符串被转换为指向其第一个元素的指针,然后传递该指针。按价值。

它按值传递。

string1char数组起始位置的地址,并且正在传递此值。

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编程。

请注意,这仅在函数参数的情况下发生。

最新更新