[英]Is “char*” in argument a pointer to a single char or a char array?
這是一個關於C的一般性問題。(我沒有很多用C語言編寫的經驗)所以,如果我有一個以char*
作為參數的函數。 如何知道它是一個指向單個char
還是char
數組的指針,因為如果它是一個char
數組我可以期待一個\\0
但是如果它不是一個char數組那么我就不想搜索\\0
。
參數中的
char*
是指向單個char
還是char
數組的指針?
是。
char*
類型的參數始終是指向char
對象的指針(或空指針,不指向任何內容,如果這是調用者作為相應參數傳遞的內容)。
它不是指向數組的指針(例如,類型為char(*)[42]
的指針),但訪問數組元素的常用方法是通過指向元素類型的指針,而不是整個陣列。 為什么? 因為實際的指向數組的指針必須始終指定數組的長度(在我的示例中為42
),這是不靈活的,並且不允許相同的函數處理不同長度的數組。
char*
參數可以被視為指向單個char
對象的指針。 例如,獲取輸入字符的函數可能會聲明如下:
bool get_next_char(char *c);
這里的想法是函數的結果告訴你它是否成功; 實際的輸入字符是通過指針“返回”的。 (這是一個人為的例子; <stdio.h>
已經有幾個從輸入讀取字符的函數,它們不使用這種機制。)
比較strlen
函數,它計算字符串的長度:
size_t strlen(const char *s);
s
指向char
數組的第一個元素; 在內部, strlen
使用該指針遍歷數組,尋找終止'\\0'
字符。
忽略const
,這兩個函數的char*
參數之間沒有真正的區別。 實際上,C沒有很好的方法來區分這些情況:一個指向單個對象的指針與指向數組第一個元素的指針。
它確實有一種糟糕的方式來區分它。 例如, strlen
可以聲明為:
size_t strlen(const char s[]);
但是C根本沒有數組類型的參數。 參數聲明const char s[]
被“調整”為const char *s
; 它意味着完全相同的事情。 你甚至可以為看起來像數組參數的東西聲明一個長度:
void foo(char s[42]);
它將被悄然忽略; 以上內容實際上與以下內容完全相同:
void foo(char *s);
[42]
可能有一些文檔值,但注釋具有相同的值 - 並且就編譯器而言具有相同的意義。
指向單個對象的指針和指向數組第一個元素的指針之間的任何區別都必須由程序員進行,最好是在函數的文檔中。
此外,這種機制不會讓函數知道數組有多長。 特別是對於char*
指針,通常使用空字符'\\0'
作為字符串結尾的標記 - 這意味着調用者有責任確保該標記實際存在。 否則,您可以將長度作為單獨的參數傳遞,可能是size_t
類型。 或者你可以使用你喜歡的任何其他機制,只要一切都是一致的。
...因為如果它是一個
char
數組我可以期待\\0
...
不,你不能,至少不一定。 char*
可以很容易地指向char
數組的第一個元素, 它不是由'\\0'
字符終止 (即,它不包含字符串 )。 如果你願意,可以強加這樣的要求。 對字符串進行操作的標准庫函數強加了該要求 - 但它們並未強制執行。 例如,如果將指向未終止的數組的指針傳遞給strlen
,則行為未定義。
推薦閱讀: comp.lang.c FAQ的第6部分。
您無法確定指針引用的字節數。 你需要自己跟蹤這個。
char數組可能沒有以\\0
結尾,在這種情況下,您需要知道數組的長度。 此外,數組的長度可能為1,在這種情況下,您有一個字符沒有終止\\0
。
約的好處C
是,你能定義有關數據結構的細節,所以你不僅限於一個字符數組總是以結束\\0
。
用於描述C數據結構的一些術語是同義詞。 例如,數組是連續的數據元素系列,字符數組是字符串,字符串可以用空字符( \\0
)終止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.