[英]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總是按值傳遞參數,但字符串與其他數組一樣,將轉換為指向其第一個元素的指針,然后傳遞該指針。 按價值。
它正在傳遞價值。
string1
是char
數組的起始位置的地址,並且正在傳遞此值。
和
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.