2017-02-20 44 views
-2

Я пытаюсь иметь массив строк, где в каждом индексе этого массива существует другой массив строк.Char указатель на массив указателей в C

char Example[0] = { "array", "of", "strings"} 
Example[1] = { "array", "of", "strings2"} 
Example[...] = { ... } 

Я думал о попытке использовать символ ** массив [some_number] как способ сделать это, но я нашел синтаксис, чтобы быть неудобным.

#include <stdio.h> 

int main(){ 
    char *test[10] = {0}; 
    char *ex[3] = {0}; 

    ex[0] = "array"; 
    ex[1] = "of"; 
    ex[2] = "strings"; 

    test[3] = *ex; 

    printf("Content of test[3] = %s %s\n", test[3], ???); 

    return 0; 
} 

Я с трудом пытается напечатать это ... есть ли другой способ, которым я могу идти о достижении того, что я упомянул? Любые ресурсы/помощь будут отличными.

+1

Это * почти * звучит как вы пытаетесь изготовить массив массив указатель на константные строки.Я использую «почти» там, потому что я читаю ваш пост четыре раза, и я все еще не мог различить, что вы ищете наверняка. – WhozCraig

+1

'char * Пример [] [3] = {{" array "," of "," strings "}, {" array "," of "," strings2 "}, /*...*/};' ? – BLUEPIXY

+0

Ну, я действительно пытаюсь создать хэш-таблицу адресов виртуальной памяти. Моя первоначальная мысль заключается в том, что с использованием какого-либо типа хэша я группирую конкретные адреса в «ведра». Я думал, что если бы у меня был массив указателей на массивы, я мог бы достичь этого. Тем не менее, я потерялся в синтаксисе. –

ответ

2

Попробуйте это:

const char* example[] = { "array", "of", "strings" }; 

Это массив 3 (неявно) указателей на массивы полукокса, которые не могут быть изменены. Прочтите первый на example[0].

+0

Мне нужен более динамичный подход. –

5

Я не уверен точно, что вы хотите, но если вам нужен массив, содержащий указатели на массивы строк, то у вас есть две альтернативы.

Во-первых, следует помнить, что массивы распадается на указатель на его первый элемент. Для получения массива строк, как

const char *array_of_strings[3] = { "abc", "def", "ghi" }; 

то результат распада (который равен &array_of_strings[0]) представляет собой указатель на указатель на const char, т.е. const char**. Это значит иметь массив, что вы делаете что-то вроде

const char **array_or_arrays_1[] = { array_of_strings }; 

Другой способ иметь указатель на явную массив строк, используя адрес оператора &. Когда вы до &array_of_strings, вы получаете указатель на массив из трех указателей на char, тип const char *(*)[3]. Вы можете объявить его легко, используя типовые псевдонимы:

typedef const char *(array_of_3_strings_t)[3]; 
array_of_3_strings *array_of_arrays_2[] = { &array_of_strings }; 
+0

Как сделать это более динамичным? –

+0

@JeffGreene Type-aliases (используя 'typedef') и' malloc'? –

+0

@JeffGreene Что именно вы подразумеваете под более «динамикой»? – RoadRunner

0

Я пытаюсь понять, что вы говорите о «более динамичном подходе». Возможно, вы хотите создать массив списка, каждый из которых (строки) может иметь разный размер. Если это было вы хотите, это коды могут помочь:

#include<stdio.h> 
#include<string.h> 
typedef char * string; 
int main() 
{ 
    string array1[]={"apple","durian"}; 
    string array2[]={"mustard","carrot","spinach"}; 
    string array3[]={"garlic","onion","pepper", "blackpepper"}; 

    string 
     * array_of_array[]={ array1, 
          array2, 
          array3 }; 


    printf("\n%s %s", array_of_array[0][1],array_of_array[2][3]); 

    return 0; 
} 

консоли Результат:

дуриан blackpepper

Но, если вы имеете в виду все ресурсы должны быть установлены динамически, так что этот код могут помочь ...

#include<stdio.h> 
#include<string.h> 

typedef char * string; 
typedef string * arrayString; 
typedef arrayString * arrayList; 

string newString(char * temp); 
arrayString newArrayString(int size); 
arrayList newArrayList(int size); 

int main() 
{ 
//Example 1, static allocation, string constant 
    string array1[]={"apple","durian"}; 
    string array2[]={"mustard","carrot","spinach"}; 
    string array3[]={"garlic","onion","pepper", "blackpepper"}; 

    arrayString Example_One[3]={ array1, array2, array3 }; 

//Example 2, dynamic allocation using pointer struct 
/************************************************************/ 
    arrayList Example_Two=newArrayList(3); 
     arrayString ExTwoValue1=newArrayString(2); 
     arrayString ExTwoValue2=newArrayString(3); 
     arrayString ExTwoValue3=newArrayString(4); 

     Example_Two[0]=ExTwoValue1; 
      ExTwoValue1[0]=newString("apple2"); 
      ExTwoValue1[1]=newString("durian2"); 
     Example_Two[1]=ExTwoValue2; 
      ExTwoValue2[0]=newString("mustard2"); 
      ExTwoValue2[1]=newString("carrot2"); 
      ExTwoValue2[2]=newString("spinach2"); 
     Example_Two[2]=ExTwoValue3; 
      ExTwoValue3[0]=newString("garlic2"); 
      ExTwoValue3[1]=newString("onion2"); 
      ExTwoValue3[2]=newString("pepper2"); 
      ExTwoValue3[3]=newString("blackpepper2"); 

/************************************************************/ 

//Print Result Here...  
    printf("\n%s %s", Example_One[0][0],Example_One[2][3]); 
    printf("\n\n%s %s", Example_Two[0][0],Example_Two[2][3]); 

    return 0; 
} 

string newString(char * temp) 
{ 
    string str = (string)malloc(sizeof(char)*(strlen(temp)+2)); 
    strcpy(str,temp); 
    return str; 
} 

arrayString newArrayString(int size) 
{ 
    arrayString arrStr= (arrayString)malloc(sizeof(string)*size); 
    return arrStr; 
} 

arrayList newArrayList(int size) 
{ 
    arrayList arrLst= (arrayList)malloc(sizeof(arrayString)*size); 
    return arrLst; 
} 

Консоль Результат:

яблоко blackpepper

apple2 blackpepper2

 Смежные вопросы

  • Нет связанных вопросов^_^