[英]Trouble with pointers to pointers
我目前正在學習指針,看來我無法正確處理它們。
所以我有一個字符串數組,我這樣表示:
char** array;
我可以使用此功能打印數組的所有字符串,它可以正常工作:
void write_lines(char** array_of_string)
{
for(; *array_of_string; array_of_string++)
printf("%s", *array_of_string);
}
但是我現在想做的是更改數組的內容,為此,我想使用將char***
作為參數的函數:
void write_lines_2(char*** array_of_string)
{
for(; ***array_of_string; (*array_of_string)++)
printf("%s", **array_of_string);
}
此功能僅是測試,以了解如何使用char ***作為參數正確訪問元素 。 如您所料,它可以編譯,但是啟動時崩潰。
您能解釋一下該怎么做嗎?
編輯:最終該函數將交換數組中的字符串。
我已經有一個swap(char** string, char** string2)
函數,這就是為什么我認為我需要第三個指針來更改作為參數傳遞的數組的內容,而不僅僅是更改它的副本。
編輯2 :我嘗試了更多的事情,我意識到:
void write_lines(char*** array_of_string)
{
int length = 3; // array goes from [0] to [3]
for(i = 0; i <= length; i++) // It works!
printf("%s", *(*array_of_string + i));
for(i = 0; i <= length; i++, array_of_string++) // Crash
printf("%s", **array_of_string);
for(i = 0; i <= length; i++, array_of_string++); // Doesn't crash
for(i = 0; i <= length; i++, (*array_of_string)++) // Crash
printf("%s", **array_of_string);
for(i = 0; i <= length; i++, (*array_of_string)++); // Crash
}
我想我應該使用(*array_of_string)++
更改指向的字符串,因為array_of_string++
會更改指向的數組,但是我不確定。 無論如何,即使我可以用另一種方式構建函數,這也只是一種練習,所以對我來說重要的是要理解為什么我嘗試執行的操作不起作用,而我仍然不知道為什么。
這有點奇怪
void write_lines(char** array_of_string)
{
for(; **array_of_string; array_of_string++)
printf("%s", *array_of_string);
}
它說數組的末尾是一個空字符串。 我想你真的想要
void write_lines(char** array_of_string)
{
for(; *array_of_string; array_of_string++)
printf("%s", *array_of_string);
}
它說數組的末尾是一個空指針。 這是更正常的(首先,它允許數組中的空行)
您的代碼似乎以空字符終止-似乎您希望其以NULL
字符串終止。 您將需要進行以下更改:
void write_lines(char** array_of_string)
{
// remove one dereference in the terminating condition of the loop
for(; *array_of_string; array_of_string++)
printf("%s", *array_of_string);
}
為了使它更具可讀性,我可以通過以下方式編寫該方法:傳遞數組的大小,而不用擔心使用NULL
終止數組:
#include <stdio.h>
#define SIZE 2
// Note that I'm passing the char** and the size.
void write_lines(char** arr, size_t n) {
if(!arr) return;
for(size_t i = 0; i < n; ++i) {
printf("%s\n", arr[i]);
}
}
int main() {
char* strings[SIZE] = { "Hello", "World" };
write_lines(strings, SIZE);
return 0;
}
首先,frst函數應如下所示:
void write_lines(char** array_of_string)
{
// char * = string (pointer to string start)
// char ** = array of strings
// the pointer to string start should be valid
for(; *array_of_string; array_of_string++)
printf("%s", *array_of_string);
}
然后,您會看到,當函數參數變為char ***pointer_to_array_of_strings
char **array_of_strings = *pointer_to_array_of_strings
。 然后,您可以執行與write_lines
相同的操作。 故障出在(*pointer_to_array_of_string)++
因為它會將array_of_strings
移動sizeof(char **)
。
PS:在這里, pointer_to_array_of_strings
和array_of_strings
有點混亂。 在這里,我用前者表示char ***
而用后者表示char **
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.