繁体   English   中英

C语言编程,指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM