C指针指向数组的指针

时间:2017-02-20 08:31:05

标签: c arrays pointers char

我正在尝试使用一个字符串数组,其中此数组的每个索引都存在另一个字符串数组。

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

我曾想过尝试使用char ** array [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;
}

我在尝试打印出来时遇到了困难...有没有其他方法可以实现我提到的内容?任何资源/帮助都会很棒。

3 个答案:

答案 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 };

答案 1 :(得分:2)

试试这个:

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

这是一个3(隐式)指向char数组的数组,无法修改。通过example[0]阅读第一个。

答案 2 :(得分:0)

我想了解你在说什么&#34;更有活力的方法&#34;。 也许你想要制作列表数组,每个列表(字符串)可以有不同的大小。如果那是你想要的,这些代码可能有所帮助:

#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;
}

控制台结果:

  

durian 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;
}

控制台结果:

  

apple blackpepper

     

apple2 blackpepper2