[英]c programming language,pointer
#include<stdio.h>
#include<conio.h>
main()
{
char *q[]={"black","white","red"};
printf("%s",*q+3);
getch();
return 0;
}
代码给出输出“ ck
”。 在此,我想知道如何评估*q+3
表达式。 意味着首先对*q
求值,然后将*q
指向的值加3
。 如果是整数数组,则很容易实现,但是这里*q
指向“黑色”,那么在什么地方加3
?
q被取消引用,指向q [0]。 这是指向字符串文字“ black”的指针。 然后添加三个,使其指向“黑色”中的“ c”。 当作为字符串传递时,printf()会将其解释为“ ck”。
你还不明白吗
char * []是char *的数组。 也就是说,q中的每个元素都是char *。 因此,当您执行* q时,您将获得一个指向“黑色”的指针,就像执行此操作一样:
char const * str = "black";
因此,如果加3,则在字符串内部移动,直到字符“ c”,从而显示“ ck”。
* q指向包含“ b”的内存的地址。 例如,假设该地址在内存中为100。 加3得到103的“ c”存储位置。
当您在C中使用“ ...”定义字符串时,它会在所有字符的末尾自动带有'\\ 0'或0,并且C使用此空字符来检测字符串的末尾。 在您的情况下,地址105包含“ \\ 0”。
也就是说,它仅打印103和104中的字符:“ ck”。
*
-dereferencer知道(通过编译器)它的大小,如果添加一个值,则根据值的类型跳转到下一个位置。
所以int * p; * p + 3向前移动三个整数(sizeof(int))。 (* p)+3给出p之下的值并加3。
如果您对C / C ++有疑问,一个很好的资源是http://www.cplusplus.com/ 。
有关指针的文章在这里: http : //www.cplusplus.com/doc/tutorial/pointers/ 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.