[英]Increasing Value of Array of Strings in C
我有一個分配,其中我將字符串傳遞給定義為char *get_word( char **string_ptr);
當傳遞的字符串指向'\\0'
字符時,我的主程序將停止調用該函數。 因此,我必須在函數內部實現這一行: *string_ptr += strlen( *string_ptr );
這讓我很困惑。 我的印象是*string_ptr
將是在函數中傳遞的字符串。 那么,增加價值將意味着什么呢?
另一個問題。 如果**string_ptr
是一個字符串數組,那么*string_ptr
或僅是string_ptr
本身是什么?
首先, **string_ptr
語義上不能保證string_ptr
將是字符串數組或char指針數組。 處理內存管理后,這一點很明顯。
據我所知,您正在向函數傳遞指向字符串的指針。 所以你要做這樣的事情
char* string = "my string in read-only memory";
foo(&string);
要訪問指針指向的字符串的值,請先取消引用指針,然后再取消引用字符串。 解析為字符串的第一個字符。
**string_ptr
是字符串的第一個字符。
*string_ptr
是字符串
string_ptr
是指向字符串的指針。
有更清晰或至少更易理解的方式來實現您想要的目標:
char* p = *string_ptr;
for(char* p = *string_ptr; *p != '\0' p++);
您創建指向字符串的新指針
然后增加它,直到它指向持有\\0
的地址
向變量添加更多*
只是意味着它指向另一件事。
char* ch; // ch points to char or string
char** ch; // ch points to char*
char*** ch; // ch points to char**
等等
* string_ptr將是在函數中傳遞的字符串。 那么,增加價值將意味着什么呢?
您對此是正確的。 指針值的增加通常意味着對變量執行指針算術。 從本質上講,它與增加正則變量相同,但是這次是對地址值執行的,其中增加1意味着增加1 * sizeof(type)
我演示了什么是增量指針及其作用。
*string_ptr += strlen( *string_ptr );
因為*string_ptr
是字符串偏移量,這會使您的字符串指向其末尾。 因此,如果您在此之前獲得更多參考,那將是很好的。
我有一個分配,我用[原型]
char *get_word( char **string_ptr);
將字符串傳遞給函數char *get_word( char **string_ptr);
當傳遞的字符串指向“ / 0”字符時,我的主程序將停止調用該函數。
重要的是要區分一個字符串 (它是一個以null終止的char
數組)和一個指向字符串(字符串的第一個字符)的指針 , 指針是如何將字符串傳送到函數並從函數返回,以及通常如何使用字符串一般都可以訪問。 指向字符串第一個字符的char *
與字符串本身是獨立的並且獨立。 因此,您的陳述僅在解釋為“當傳遞了地址的指針變量的值指向字符串的'/ 0'時,我的main會停止調用該函數”時才有意義。
因此,我必須在函數內部實現這一行:
*string_ptr += strlen( *string_ptr )
;
實際上,這將更新string_ptr
指向的地址處的指針值,以使其指向其最初指向的字符串的終止符。 但是,我傾向於這不是您真正想要的,因為那樣就不需要多次調用該函數。 如果函數無條件執行該語句,則傳遞的指針將僅在一次調用后始終指向終止符。
這讓我很困惑。 我的印象是
*string_ptr
將是在函數中傳遞的字符串。 那么,增加價值將意味着什么呢?
*string_ptr
是string_ptr
指向的內容。 使用您提供的聲明,它將是char *
類型的指針。 請記住:區分此類指針和它所指向的東西(在這種情況下為字符串的第一個字符)非常重要。 增加指針的值只會使其指向字符串中的后面某個字符(只要您不增加太多)。 如果將其增加字符串中所有字符的數量,則它將指向終止符。
另一個問題。 如果
**string_ptr
是一個字符串數組,那么*string_ptr
或僅是string_ptr
本身是什么?
*string_ptr
和**string_ptr
被視為表達式,在上下文中是沒有意義的。 您提供的聲明,但是,表達*string_ptr
計算結果為char *
通過指向string_ptr
。 表達**string_ptr
計算結果為char
由指向char *
通過指向string_ptr
。 string_ptr
本身就是函數參數的值,該參數被聲明為指向char
指針的指針。
但是我認為您實際上是在詢問函數原型,在這種情況下,您提出了錯誤的問題。 通常的問題是關於參數string_ptr
的類型( char **
) string_ptr
表示字符串數組。 答案在幾個層面上是“否”,在至少一個層面上是“也許”。
表面上,類型char **
表示指向char **
的指針。 這可能是一個指向第一個char *
在數組char *
,那就是,如果你提出這樣的一個數組的相應參數會是什么。 絕對不能確定所指向的char *
是數組的成員,如果是,則不會傳遞有關該數組長度的任何信息。 有這樣一個指針指向一個單一的,標量之間沒有有意義的區別char *
和其指向的一構件陣列的第一和唯一的元素char *
。
當然,同一區別適用於下一級。 一個有效的char *
通常指向一個字符串的第一個char
,但是您不能單憑類型知道它。 假設這樣的指針是有效的,它可能指向一個未終止的char
數組,或者指向單個標量char
。 特別是對於char *
類型,它也可能指向任何其他類型的對象的值的原始字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.