我以指向字符指標(即 char **)的指標的形式給出了一個字串陣列。我希望訪問陣列中的每個元素,
char **strings = {"hello", "bye", "whatusp"};
printf("%s\n", *(&strings));
printf("%s\n", *(&strings 1));
我注意到第一個 printf() 有效,因為它為我輸出“hello”,但第二個不輸出任何內容。 1 確實增加了 8 而不是 1,因為地址以位元組為單位。如何在這樣的雙指標中訪問任意元素?
uj5u.com熱心網友回復:
就像這樣簡單:
char *strings[] = {"hello", "bye", "whatusp"};
printf("%s\n", strings[0]);
printf("%s\n", strings[1]);
printf("%s\n", strings[2]);
uj5u.com熱心網友回復:
首先,線
char **strings = {"hello", "bye", "whatusp"};
是錯的。如果要宣告一個包含 3 個指向字串文字的指標的陣列,則應改為:
char *strings[3] = {"hello", "bye", "whatusp"};
在上一行中,您可以省略3,因為編譯器足夠聰明,可以自己計算元素的數量,因為您正在初始化陣列。
線條
printf("%s\n", *(&strings));
printf("%s\n", *(&strings 1));
也是錯誤的,因為printf與%s格式說明符一起使用時,您必須提供指向字串的指標,即 a char *。但是,您char**在兩行中都提供了 a 而不是。
由于以下原因,運算式*(&strings)將計算為 a :char **
該運算式&strings將計算為指向 的指標strings。由于strings它本身是一個由 3 個指向的指標組成的陣列,因此指向char的指標strings是指向由 3 個指向 的指標組成的陣列的指標char。之后,您將*在此資料型別上應用間接運算子,因此此操作的結果是一個由 3 個指標組成的陣列char。當將此資料型別傳遞給printf時,陣列將衰減為指向陣列第一個元素的指標,即指向指向 a 的指標char(即 a char**)的指標。
您應該簡單地撰寫以下內容:
printf( "%s\n", strings[0] );
printf( "%s\n", strings[1] );
運算式strings[1]等價于*(strings 1)。
uj5u.com熱心網友回復:
char **strings是指向 char 指標的指標,而不是指向 char 的指標陣列,您的編譯器無論如何都應該給您一個警告,如果沒有,您應該啟用它們。
要使該分配起作用,您將需要一個指標陣列,char *strings[] 或者如果您想使用普通指標表示法(陣串列示法在后臺使用指標算術),您可以為第一個維度動態分配記憶體。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 3
int main(void)
{
char **strs = NULL;
if ((strs = malloc(SIZE * sizeof(char *))) == NULL) /* check malloc result */
{
exit(EXIT_FAILURE);
}
*strs = "hello"; /* assignment makes sense in this case but you cant modify the string since its read-only*/
*(strs 1) = "bye";
*(strs 2) = "whatsup";
for (int i = 0; i < SIZE; i )
{
puts(*(strs i));
}
/* Alternative that will allocate space for each string if you need to store them or modify them later */
/* for (int i = 0; i < 3; i )
{
if ((*(strs i) = malloc(YOUR_STRINGS_LENGTH)) == NULL)
{
exit(EXIT_FAILURE);
}
snprintf(*(strs i), YOUR_STRINGS_LENGTH, "string");
}
*/
return 0;
}
uj5u.com熱心網友回復:
我以指向字符指標的指標的形式給出了一個字串陣列(即 char **)
沒有這樣的東西: achar**只是一個指標。它不是一個陣列。if thingis char**then
*thingis char*and **thingis,正如宣告的那樣, a char。
陣列可以看作是指標,但指標不是陣列。
注意:原型為main一般
int main( int argc, char** argv)
因此,您需要做的與從系統中獲取的每個 C 程式相同。
例子
要擁有指向您char**的指標陣列,char必須構建它
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
char* array[] = {
"I", "wish", "to", "access", "each", "element",
"in", "the", "array"
};
int N = sizeof(array) / sizeof(char*);
printf("%d strings in total\n\n", N);
char** strings = (char**)malloc(N * sizeof(char*));
for (int i = 0; i < N; i=i 1)
*(strings i) = *(array i);
for (int i = 0; i < N; i=i 1)
printf("= %s\n", 1 i, *(i strings));
// pointer is not an array
char thing = '@';
char* p = &thing;
char** pp = &p;
printf("\n\nthing is '%c', *p is '%c', **pp is '%c'\n",
thing, *p, **pp);
return 0;
}
輸出
9 strings in total
1 I
2 wish
3 to
4 access
5 each
6 element
7 in
8 the
9 array
thing is '@', *p is '@', **pp is '@'
特別注意這一行
char** strings = (char**)malloc(N * sizeof(char*));
for (int i = 0; i < N; i=i 1)
*(strings i) = *(array i);
其中 定義strings為所需大小的區域,然后將指標初始化為輸入陣列的字串。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/434177.html
下一篇:c中的qsort型別轉換指標
