簡體   English   中英

C字符串函數調用,按值傳遞還是引用?

[英]C string function calls, pass by value or reference?

我無法弄清楚發生了什么,我認為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);
 }

令人困惑的輸出是:

在主要開始

在FUNC開始

在主要開始

那么這里發生了什么? 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中,第一個總是被轉換為第二類函數defination。所以在函數參數的情況下, N element array of type T被轉換為Array of type T ,記住它並享受C編程。

注意這僅在功能參數的情況下發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM