我正在练习使用指针.
我有一个指向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值
你首先必须得到一个指针,你需要一个什么时候停止.可以使用最后一个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*)
.乍一看看起来像指针的是同一类型的元素块.对于寻址元素,编译器可以在表达式中组成一个数组中的指针,然后可以用它来寻址数组中的元素.如果这样做str++
,编译器将为您创建一个指针.但是这个指针是暂时的,只是暂时存在,其目的只是为了立即对它做一些事情,但它不能像增加一样改变.这就是我们创建一个真正的指针变量然后可以递增的原因.