如何创建指向二维数组的指针数组

时间:2015-01-19 22:47:26

标签: c arrays pointers

我真的不知道如何解释它。请多多包涵。
我尝试将二维数组传递给函数string[][],在该函数中我将创建一个指向我传入的数组的指针。我将比较string[][]

//From main
char string[3][3] = {"cat","dog","bat"};
//From function
declare a pointer which points to string;
if (strcpm(string[1],string[2]) == 1)
    {
        pointer[1] value set to address of string[2];
        pointer[2] value set to address of string[1]
    }
printf("%s", *(pointer));

我不想修改string[3][3],然后该功能退出该功能而不返回任何内容
我有这个想法,但我不知道如何申报pointer,请帮助我。谢谢! 可视化

In main                     In function
string                      ptr
cat                         1000
dog                         1008
bat                         1012
Do compare
dog > bat
ptr[3] = address of dog;
ptr[2] = addess of bat;
printf("%s", *(ptr+1);
printf("%s", *(ptr+2);
quit function, return nothing

3 个答案:

答案 0 :(得分:0)

在C中,字符串表示为字符数组。这以两种常规方式表示,char* identifierchar identifier[]。二维数组声明为指向字符串的指针。所以,它可以写成

char **strArray1
char  *strArray2[]
char   strArray3[][]

每个都有不同的含义,我不会因为它的迂腐而进入这里。

要尽可能地回答您的问题,您可以将帖子中的代码编写为

int main (void) {
    char * strArray[2] = { "This is a String", "This is a String too" };
    if (strcmp(strArray[0], strArray[1]) == 0) {
       ...
    }
    return 0;
}

答案 1 :(得分:0)

对于接受字符串数组的函数(不是指向字符串的指针数组,这是不同的):

void func(size_t rows, size_t cols, char strings[rows][cols])
{
    char const *pointers[rows];

    // Initialize each pointer to point to each row
    for (size_t i = 0; i < rows; ++i)
         pointers[i] = &strings[i][0];

    // here you can manipulate the pointers, e.g. bubble sort them

    printf("%s\n", pointers[0]);
}

调用此功能:

int main()
{
    char stuff[4][20] = { "cat", "dog", "snuffleupagus", "horse" };

    func(4, 20, stuff);
}

专业提示:您可以计算数组维度,而不是使用幻数:

#define LENGTH_OF(array) ( sizeof(array) / sizeof((array)[0]) )

char stuff[][20] = { "cat", "dog", "snuffleupagus", "horse" };
func( LENGTH_OF(stuff), LENGTH_OF(stuff[0]), stuff );

如评论中所述,请注意第二个维度(在我的情况下为20)。 C允许使用完全相同长度的字符串初始化char数组,在这种情况下,数组最终不包含字符串(即它将包含非空终止的字符)。

答案 2 :(得分:0)

我不知道我是否理解正确,但如果我这样做,我会发布一个示例,您可以传递一个“字符串”数组(在C中表示为char数组的数组)。然后你可以比较数组中的两个第一个字符串

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

char* my_function(char *strings[]) {
    char *ptrToString = NULL;

    if (strcmp(strings[0],strings[1]) > 0)   // Do you really mean '==1' here?
    {
        ptrToString = strings[1];
    } else {
        ptrToString = strings[0];
    }

    printf ("%s\n", ptrToString);   // No need for '*', %s takes a pointer to char as argument

    return ptrToString;
}

void main (void) {
   char *a[] = {"dog", "cat"};
   my_function(a);
}

注意: *我更改了“strcmp()== 1”以检查返回是否正确。检查特定值是非常规的(可能与您的C实现不匹配)。在文档中,唯一的保证是strcmp将返回正数,负数或零,但不是特定值。 http://linux.die.net/man/3/strcmp *数组中必须至少有两个空值处理的字符串才能使my_function函数在没有segfaulting的情况下工作。

我希望这能引导你朝着正确的方向前进。