C字符串函数调用,按值传递还是引用?

时间:2014-03-29 17:04:15

标签: c string parameter-passing

我无法弄清楚发生了什么,我认为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[]

4 个答案:

答案 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)

它正在传递价值。

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

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

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