Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指向字符数组的指针数组_C_Pointers - Fatal编程技术网

C 指向字符数组的指针数组

C 指向字符数组的指针数组,c,pointers,C,Pointers,通用条款4.4.4 c89 但是,我在显示所有动物时遇到了一个问题 我有以下代码 我正在尝试显示阵列中的所有动物。我有3个指向char*的指针数组。然后是指向这些数据集的指针数组 我试图控制内部循环以检查-1和外部循环的NULL void initialize_char_array() { char *data_set1[] = {"dog", "cat", "bee", NULL}; char *data_set2[] = {"rabbit", "ant", "snake",

通用条款4.4.4 c89

但是,我在显示所有动物时遇到了一个问题

我有以下代码

我正在尝试显示阵列中的所有动物。我有3个指向char*的指针数组。然后是指向这些数据集的指针数组

我试图控制内部循环以检查-1和外部循环的NULL

void initialize_char_array()
{
    char *data_set1[] = {"dog", "cat", "bee", NULL};
    char *data_set2[] = {"rabbit", "ant", "snake", "rat", NULL};
    char *data_set3[] = {"cow", "lizard", "beaver", "bat", "hedgehog", NULL};

    char *ptr_char[] = {*data_set1, *data_set2, *data_set3, NULL};

    display_char_array(ptr_char);
}

void display_char_array(char **ptr_char)
{
    size_t inner = 0, outer = 0;

    for(outer = 0; ptr_char[outer] != NULL; outer++) {
        for(inner = 0; *ptr_char[inner] != -1; inner++) {
            printf("data [ %s ]\n", ptr_char[outer][inner]);
        }
    }
}

非常感谢您的建议,

鉴于您的
初始化字符数组
函数初始化
ptr\u字符
数组的方式,您将永远无法显示所有动物。您将只能显示三个列表中的第一个。如果您希望能够访问所有动物,应首先将
ptr\u char
定义为指向char指针的指针数组:
char**ptr\u char[]


然后,display函数应将此类型的参数
char***
作为参数。是的,这是三个间接层次。然后,不要使用
size\u t
变量在数组中循环,使用
char**
one和
char*

鉴于
initialize\u char\u array
函数初始化
ptr\u char
数组的方式,您将永远无法显示所有动物。您将只能显示三个列表中的第一个。如果您希望能够访问所有动物,应首先将
ptr\u char
定义为指向char指针的指针数组:
char**ptr\u char[]


然后,display函数应将此类型的参数
char***
作为参数。是的,这是三个间接层次。然后,不要使用
size\t
变量在数组中循环,使用
char**
one和
char*

*数据集1
数据集1[0]相同。
这里有一个你想要做的固定版本。我不知道你用的是什么口味:
循环中的索引变量或指针迭代器,显然编译器将生成完全相同的机器代码

// type of ptr_char changed
void display_char_array(char **ptr_char[])
{
    size_t inner = 0, outer = 0;

    for(outer = 0; ptr_char[outer] != NULL; outer++) {
        // check for NULL in inner loop!
        for(inner = 0; ptr_char[outer][inner] != NULL; inner++) {
            printf("data [ %s ]\n", ptr_char[outer][inner]);
        }
    }
}
void initialize_char_array()
{
    char *data_set1[] = {"dog", "cat", "bee", NULL};
    char *data_set2[] = {"rabbit", "ant", "snake", "rat", NULL};
    char *data_set3[] = {"cow", "lizard", "beaver", "bat", "hedgehog", NULL};

    // fixed
    char **ptr_char[] = {data_set1, data_set2, data_set3, NULL};

    display_char_array(ptr_char);
}

*数据集1
数据集1[0]
相同。 这里有一个你想要做的固定版本。我不知道你用的是什么口味: 循环中的索引变量或指针迭代器,显然编译器将生成完全相同的机器代码

// type of ptr_char changed
void display_char_array(char **ptr_char[])
{
    size_t inner = 0, outer = 0;

    for(outer = 0; ptr_char[outer] != NULL; outer++) {
        // check for NULL in inner loop!
        for(inner = 0; ptr_char[outer][inner] != NULL; inner++) {
            printf("data [ %s ]\n", ptr_char[outer][inner]);
        }
    }
}
void initialize_char_array()
{
    char *data_set1[] = {"dog", "cat", "bee", NULL};
    char *data_set2[] = {"rabbit", "ant", "snake", "rat", NULL};
    char *data_set3[] = {"cow", "lizard", "beaver", "bat", "hedgehog", NULL};

    // fixed
    char **ptr_char[] = {data_set1, data_set2, data_set3, NULL};

    display_char_array(ptr_char);
}

在尝试(未成功)调试您编写的版本后,我重新编写了您的程序:

#include <stdio.h>

void display_char_array(char ***ptr_char)
{
    for ( ; *ptr_char != NULL; ptr_char++ ) {
        char **data_set;
        for ( data_set = *ptr_char; *data_set != NULL; data_set++ ) {
            printf("data [ %s ]\n", *data_set);
        }
    }
}

void initialize_char_array()
{
    char *data_set1[] = {"dog", "cat", "bee", NULL};
    char *data_set2[] = {"rabbit", "ant", "snake", "rat", NULL};
    char *data_set3[] = {"cow", "lizard", "beaver", "bat", "hedgehog", NULL};

    char **ptr_char[] = { data_set1, data_set2, data_set3, NULL };

    display_char_array(ptr_char);
}

int main( void )
{
    initialize_char_array();

    return 0;
}
#包括
无效显示字符数组(字符***ptr字符)
{
for(;*ptr_char!=NULL;ptr_char++){
字符**数据集;
对于(数据集=*ptr\u char;*data\u set!=NULL;数据集++){
printf(“数据[%s]\n”,*数据集);
}
}
}
无效初始化字符数组()
{
char*data_set1[]={“dog”、“cat”、“bee”,NULL};
char*data_set2[]={“兔子”、“蚂蚁”、“蛇”、“老鼠”,NULL};
char*data_set3[]={“奶牛”、“蜥蜴”、“海狸”、“蝙蝠”、“刺猬”,NULL};
字符**ptr_char[]={data_set1,data_set2,data_set3,NULL};
显示字符数组(ptr字符);
}
内部主(空)
{
初始化字符数组();
返回0;
}

你的版本会出错,你使用的指针非常混乱

我在尝试(未成功)调试您编写的版本后重新编写了您的程序:

#include <stdio.h>

void display_char_array(char ***ptr_char)
{
    for ( ; *ptr_char != NULL; ptr_char++ ) {
        char **data_set;
        for ( data_set = *ptr_char; *data_set != NULL; data_set++ ) {
            printf("data [ %s ]\n", *data_set);
        }
    }
}

void initialize_char_array()
{
    char *data_set1[] = {"dog", "cat", "bee", NULL};
    char *data_set2[] = {"rabbit", "ant", "snake", "rat", NULL};
    char *data_set3[] = {"cow", "lizard", "beaver", "bat", "hedgehog", NULL};

    char **ptr_char[] = { data_set1, data_set2, data_set3, NULL };

    display_char_array(ptr_char);
}

int main( void )
{
    initialize_char_array();

    return 0;
}
#包括
无效显示字符数组(字符***ptr字符)
{
for(;*ptr_char!=NULL;ptr_char++){
字符**数据集;
对于(数据集=*ptr\u char;*data\u set!=NULL;数据集++){
printf(“数据[%s]\n”,*数据集);
}
}
}
无效初始化字符数组()
{
char*data_set1[]={“dog”、“cat”、“bee”,NULL};
char*data_set2[]={“兔子”、“蚂蚁”、“蛇”、“老鼠”,NULL};
char*data_set3[]={“奶牛”、“蜥蜴”、“海狸”、“蝙蝠”、“刺猬”,NULL};
字符**ptr_char[]={data_set1,data_set2,data_set3,NULL};
显示字符数组(ptr字符);
}
内部主(空)
{
初始化字符数组();
返回0;
}

你的版本会出错,你使用的指针非常混乱

错误在于ptr_char的初始化仅使用数据集?中的第一个元素,请参见以下内容:

void initialize_char_array()
{
    char *data_set1[] = {"dog", "cat", "bee", NULL};
    char *data_set2[] = {"rabbit", "ant", "snake", "rat", NULL};
    char *data_set3[] = {"cow", "lizard", "beaver", "bat", "hedgehog", NULL};

    char **ptr_char[] = {data_set1, data_set2, data_set3, NULL};

    display_char_array(ptr_char);
}

void display_char_array(char ***p)
{
  while( *p )
  {
    while( **p )
    {
      puts(**p);
      ++*p;
    }
    ++p;
  }
}

错误在于ptr_char的初始化仅使用data_set?中的第一个元素,请参见以下内容:

void initialize_char_array()
{
    char *data_set1[] = {"dog", "cat", "bee", NULL};
    char *data_set2[] = {"rabbit", "ant", "snake", "rat", NULL};
    char *data_set3[] = {"cow", "lizard", "beaver", "bat", "hedgehog", NULL};

    char **ptr_char[] = {data_set1, data_set2, data_set3, NULL};

    display_char_array(ptr_char);
}

void display_char_array(char ***p)
{
  while( *p )
  {
    while( **p )
    {
      puts(**p);
      ++*p;
    }
    ++p;
  }
}

检查每个数组的类型可能会有所帮助。请记住,在大多数情况下,数组表达式的类型是从T的
N元素数组
隐式转换(衰减)为指向T的
指针或
T*
1。在data_set1、data_set2和data_set3的情况下,
T
char*
,因此表达式
data_set1
被隐式地从char*
4元素数组转换为
指向char*
的指针或
char**
。其他两个阵列也是如此,如下表所示:

Array Type Decays to ----- ---- --------- data_set1 char *[4] char ** data_set2 char *[5] char ** data_set3 char *[6] char ** 这给了我们

Array Type Decays to ----- ---- --------- ptr_char char **[4] char *** 数组类型衰减为 ----- ---- --------- ptr_字符**[4]字符*** 因此,ptr_char是指向char的指针的数组,或
char**ptr_char[4]
。当您将
ptr\u char
参数传递给display函数时,它再次从char**
的类型
4元素数组隐式转换为指向char**
char***
指针



1.此规则的例外情况是当数组表达式是
sizeof
&
(地址)运算符的操作数时,或者如果表达式是用于初始化声明中另一个数组的字符串文字。

检查每个数组的类型可能会有所帮助。请记住,在大多数情况下,数组表达式的类型是从T的
N元素数组
隐式转换(衰减)为指向T的
指针或
T*
1。在data_set1、data_set2和data_set3的情况下,
T
char*
,因此表达式
data_set1
是从
4-ele隐式转换而来的