我正在练习使用指针。
我有一个指向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:'++'需要l值
答案 0 :(得分:13)
你首先必须得到一个指针,你需要一个什么时候停止。可以使用最后一个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 * sizeof(char*)
大小的4倍。乍一看看起来像指针的是同一类型的元素块。对于寻址元素,编译器可以在表达式中组成一个数组中的指针,然后可以用它来寻址数组中的元素。如果执行str++
,编译器将为您创建指针。但是这个指针是暂时的,只是暂时存在,其目的只是为了立即对它做一些事情,但它不能像增加一样改变。这就是我们创建一个真正的指针变量然后可以递增的原因。
答案 1 :(得分:1)
你的代码的问题在于你正在递增解除引用的指针str,它为数组中的第一个元素(即dog)提供了一个char *。
你应该增加str本身,而不是指向它。
然而,在这种情况下,你的循环终止检查将不起作用,因为当前str == 0的数组中没有元素成立。为了使其工作,您需要向数组添加第四个元素,即0。
答案 2 :(得分:1)
(*str)++
增加s
指向的值。您将需要递增指针本身并打印指针的值。注意,str不是l值,也不能递增。
此外,如果您先增加,那么您只剩下两个可以打印的合法字符串。之后你调用UB。
试试这个:
int main(void)
{
/* we have added a sentinel to mark the end of the array */
char *str[] = { "DOG", "CAT", "RAT", 0 };
/* since str is an array, you cannot use it to loop, have a walker */
char **w = str;
/* display using a pointer arthimatic */
while(*w)
{
printf("str: %s\n", *w++);
}
return 0;
}
在C中查找运算符优先级和绑定。
答案 3 :(得分:1)
str
,作为一个数组,不能递增。
现在,您正在递增(*str)
,即str[0]
:该数组的第一个元素。由于此元素是指针,因此您将增加指针,使其引用字符串“DOG”的后续元素。
你需要的是一个可以指向(并因此遍历)str
元素的指针。由于元素是char*
,指向它们的指针将是char**
- 双指针。
答案 4 :(得分:0)
while((*str)++)
{ printf("str: %s\n", str); }
这增加* str,即字母'd'。你不想那样做。你想增加指针。这段代码应该做你想要的:
while((str)++)
{ printf("str: %s\n", str); }