簡體   English   中英

為什么在 function 中聲明字符串參數需要 C 中的指針?

[英]Why does declaring a character string parameter in a function needs a pointer in C?

誰能解釋一下,為什么需要在 function 的字符串參數聲明中包含“星號”( * )?

#include <stdio.h>

void func2(char *fName);

int main() {
    char name[20];

    printf("What is your name? ");
    scanf("%s", name);
    //some code here

}

void func2(char *fName) {
    //some code here
}

一個直觀的原因是字符串可以采用不同的長度。 由於無法定義“一刀切”的參數類型,您需要在 function 參數中使用指針來指示字符串的開頭。

首先,請注意,C 語言沒有原生字符串類型。 在 C 中,字符串實際上是由 null 字符\0終止的一維字符數組

引用 C11, 6.3.2.1p3 [強調添加]

除非它是 sizeof 運算符、_Alignof 運算符或一元 & 運算符的操作數,或者是用於初始化數組的字符串文字,否則類型為 ''array of type'' 的表達式將轉換為具有type 'pointer to type'' 指向數組 object 的初始元素並且不是左值。

聲明

void func2 (char fName[]);
void func2 (char fName[20]);
void func2 (char fName[100]);

完全一樣

void func2 (char *fName);

這種將類數組聲明符轉換為指針的方法僅適用於 function 形式參數聲明,其他任何地方都沒有。 檢查這個

在程序中,當您將數組name傳遞給 function

int main (void) {
    char name[20];
    ......
    func2 (name);
    ......

參數namechar類型的數組,它被轉換為char類型的指針,指向數組name的初始元素。

考慮這個例子:

#include <stdio.h>

void func2 (char *fName);
void func3 (char fName[]);
void func4 (char fName[20]);
void func5 (char fName[1]);

int main (void) {
    char name[20];

    printf ("What is your name? ");
    scanf ("%19s", name);
    func2 (name);
    func3 (name);
    func4 (name);
    func5 (name);
    return 0;
}

void func2 (char *fName) {
    printf ("In func2, name: %s\n", fName);
}

void func3 (char fName[]) {
    printf ("In func3, name: %s\n", fName);
}

void func4(char fName[20]) {
    printf ("In func4, name: %s\n", fName);
}

void func5 (char fName[1]) {
    printf ("In func5, name: %s\n", fName);
}

編譯

# gcc -Wall -Wextra prg.c
#

執行

# ./a.out 
What is your name? Gem
In func2, name: Gem
In func3, name: Gem
In func4, name: Gem
In func5, name: Gem

答案分為幾個部分:

  1. C 沒有內置的一流字符串類型。
  2. char類型用於保存單個字符,例如'c' char類型的變量不能保存像"cat"這樣的多字符串(或者甚至像"c"這樣的單字符串)。
  3. 在 C 中,字符串被實現為char的以 null 結尾的arrays
  4. Arrays是C中的二等公民。 您不能將一個數組分配給另一個數組,或將數組傳遞給 function。
  5. 當您嘗試分配一個數組,或將其傳遞給 function,或者實際上做任何看起來需要數組值的事情時,您得到的是指向數組第一個元素的指針。

這就是為什么對字符串進行操作的函數會收到char *類型的 arguments 的原因。 原始字符串是一個char數組,但在 function 收到它之前的某個地方,字符串被表示為指向其第一個元素的指針。

如果您習慣於存在真正的、內置的、一流的字符串類型的語言,那么操作字符串(以及使用運算符和函數來創建新字符串)就像對整數、字符和浮點數進行操作一樣簡單——點值,然后 C 一開始可能會很混亂。 在 C 中,每當您使用字符串時,總是會涉及到指針,並且您總是必須考慮諸如指針指向的位置,以及指針是否指向足夠的 memory 以用於它試圖引用的字符串,以及是否有適當的null 終結器。 一旦你習慣了它,這一切都很容易做到,但這是你必須多想的事情。

在向函數聲明參數時,聲明一個沒有大小的數組變量(一維字符數組)相當於聲明一個指針。 通常這樣做是為了強調指針變量將以等同於數組的方式使用這一事實。

/* two equivalent function definitions */

 void func2( char *fName );
 void func2( char fName[] );

希望這會讓你更清楚。

傳遞字符串時,實際傳遞的只是指向字符串的指針

暫無
暫無

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

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