[英]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);
......
參數name
是char
類型的數組,它被轉換為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
答案分為幾個部分:
char
類型用於保存單個字符,例如'c'
。 char
類型的變量不能保存像"cat"
這樣的多字符串(或者甚至像"c"
這樣的單字符串)。char
的以 null 結尾的arrays 。 這就是為什么對字符串進行操作的函數會收到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.