我目前正在尝试学习C,并具有一些Python和以前的经验。 指针运算现在真的让我感到困惑。
sexp
为什么打印#if HTTPS_POLICY
services.AddHttpsRedirection(options =>
{
//difference options
});
#endif
而不是#include <stdio.h>
int main()
{
char *s[] = {"String1", "Literal2", "Pointers3"};
printf("%c", s[1]+1);
return 0;
}
?
当我用m
替换格式字符串时,它会执行预期的操作并打印出i
(转到第一个字符串文字的第0个索引,然后向前移动1个内存地址并打印其余内容) 。
这是如何工作的,为什么当我使用%s
格式字符串时,它会打印出看似任意的字符而不是第一(或第一)索引。
答案 0 :(得分:1)
%c
格式说明符应使用字符,而不是字符的指针。表达式s[1]
的计算结果为指向字符的指针,指向“ Literal2”,表达式s[1]+1
的计算结果为指向字符的指针,指向“ iteral2”。
因此,您正在传递printf()
指向字符的指针,并告诉它打印字符。因此,发生的情况是指针被重新解释为字符,并且输出是垃圾。
如果将一个字符插入“ String1”(使之成为“ String11”),则所有内容将在内存中向上移动一个位置,因此指针的值将增加1,依此类推它可能会打印n
而不是m
。
要获得一个字符,当您拥有的只是一个字符的指针时,您需要取消引用。所以就是"%c", *(s[1]+1)
。
答案 1 :(得分:0)
#include <stdio.h>
int main() {
const char *s[] = {"String1", "Literal2", "Pointers3"};
printf("%c", s[1][1]);
return 0; }
此外,我认为你应该让S []常数,因为它是过时了。