c - 如何使用指针显示数组中的字符串?

标签 c pointers string

我正在练习使用指针。

我有一个指向 3 个字符串数组的指针:“dog”、“cat”、“rat”。

我可以使用 for 循环和数组打印内容。

但是,我在使用指针算法打印它们时遇到了问题。我想增加指向数组中下一个元素的指针。然而,它所做的只是打印狗的字母。

代码:

int main(int argc, char **argv)
{
    char *str[3] = { "DOG", "CAT", "RAT"};
    int i = 0;

    /* display using an array element */
    for(i = 0; i < 3; i++)
    {
    printf("str: %s\n", str[i]);
    }

    /* display using a pointer arthimatic */
    while((*str)++)
    {
    printf("str: %s\n", str);
    }

    getchar();

    return 0;
}

我怎样才能做到这一点?

编辑:

代码:

while(str)
{
    printf("str: %s\n", *(str++));
}

但是,我收到此错误消息。 I 值是否必须是某种变量?

错误 C2105:“++”需要左值

最佳答案

您首先必须获得一个指针,并且您需要一个停止条件。最后一个 NULL 指针可用于此目的。所以代码就变成了

char *str[] = { "DOG", "CAT", "RAT", NULL };
char **elem_p = str;

/* display using a pointer arthimatic */
while(*elem_p) {
    printf("str: %s\n", *elem_p);
    elem_p++;
}

您所做的是增加存储在数组第一个元素中的指针。该指针永远不会太快等于空指针(如果有的话),因此,循环不会停止,直到该指针的内部值溢出或发生其他事情使其等于空指针。然后,将指向数组第一个元素的指针传递给 printf(传递数组,但编译器会将其转换为指针 - 见下文)。 Printf 会将这些指针的字节解释为字符并打印它们,如果不立即崩溃,将导致打印出垃圾。

您希望在更高级别递增:不是递增数组的一个元素(指针),而是递增指向元素本身的指针。现在,你不能做

str++

因为str是一个数组。它不是指针,即使它可以转换为指针,然后指向它的第一个元素。因此,我们创建了一个最初指向 str[0] 的指针,但再次将其递增。请注意,我们在打印后递增它,以便我们也打印出第一个元素。

实际上,我想我应该解释一下为什么你不能执行 str++。好吧,str 是一个数组。数组是占用固定存储量的对象。上面,数组占用了 char 指针大小的 4 倍,4 * sizeof(char*)。乍一看像指针的是同一类型的元素 block 。对于寻址元素,编译器可以在表达式中从数组中构造一个指针,然后可以使用它来寻址数组中的元素。如果您执行 str++,编译器将为您创建一个指针。但是那个指针是临时的,只存在一小段时间,唯一的目的是立即用它做点什么,但它不能像递增那样改变。这就是我们创建一个真正的指针变量的原因,然后我们可以递增它。

关于c - 如何使用指针显示数组中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/659064/

相关文章:

python - Python 等语言如何克服 C 的 Integral 数据限制?

c - 使用shell脚本打印c文件中的函数名称?

c - malloced 指针中的内存泄漏?

c - 遍历后表被删除

c++ - 为什么不能 static_cast 双空指针?

c - C 预处理器是否删除 "&*"的实例?

c - sizeof 运算符有可能返回 0 吗?

java - 如何获取某个字符后跟数字的子串?

python - 从 ArDrone 2.0 获取图像,并使用 cv2

c - 将字符串分配给结构中的 char*