我正在练习使用指针。
我有一个指向 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/