gpt4 book ai didi

arrays - 指向数组的指针,循环时每隔一段时间跳转一个索引

转载 作者:行者123 更新时间:2023-12-04 13:09:22 26 4
gpt4 key购买 nike

我试图将一个指针指向数组的中间,然后使用算法在该特定中间值之后和之前循环索引,该算法工作正常,但是当我尝试在指向的索引之后循环第一个索引时,我的index跳了1个数,更准确的说,如果我们认为我们的指针指向index[0],我可以用index[0]的值,然后它转到index[1],它认为是空(虽然它不是),然后转到 index[2] 并且它可以再次使用它,但是又一次,它认为 index[3] 是空的,并且这个错误像循环一样继续下去!我已经尝试了所有方法,但无论我做什么,它仍然会跳过索引 [1],我什至打开了 -Wall 和 -g 标志,而且 gcc 也没有给我任何警告!

这是代码:

#include <stdio.h>

int main()
{
char *alphabet[] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l",
"m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};

char *p_alphabet = alphabet[12];

int i;

for (i = 0; i < 26; i++) {
printf("%d: %c\n", i, p_alphabet[i]);
}
}

这是我得到的输出:

0: m
1:
2: n
3:
4: o
5:
6: p
7:
8: q
9:
10: r
11:
12: s
13:
14: t
15:
16: u
17:
18: v
19:
20: w
21:
22: x
23:
24: y
25:

最佳答案

这个声明

char *p_alphabet = alphabet[12];

没有意义。

如果你需要一个指向数组中间元素的指针,那么你必须这样写

char **p_alphabet = alphabet + 12;

或者这样写会更正确

char **p_alphabet = alphabet + 13;
^^^^

假设有 26 个初始化器。

作为这个循环

for (i = 0; i < 26; i++) {
printf("%d: %c\n", i, p_alphabet[i]);
}

迭代 26 次,然后这个表达式 p_alphabet[i] 应该至少像 p_alphabet[i][0] 那样写(考虑到我上面显示的声明) 可以访问数组外的内存。

至于你得到的输出,可以用下面的方式解释。本声明

char *p_alphabet = alphabet[12];

声明一个指向字符串文字"m"的第一个字符的指针,它作为一个包含两个元素的字符数组存储在内存中{ 'm', '\0'

此外,编译器似乎将用作数组 alphabet 初始化程序的字符串文字按顺序放置在文字池中,因为它们出现在初始化列表中。

因此内存可以表示为内存范围,顺序存储以下值

{ 'm', '\0', 'n', '\0, 'o', '\0', ..., 'x', '\0', 'y', '\0', 'z', '\0' }

并且这些值在您的 for 循环中输出。值 '\0' 不是图形符号。因此您不会在输出中看到它。

例如,如果您想要从数组的中间元素开始输出数组,然后交替输出数组中跟在中间元素之后和在中间元素之前的元素,那么程序可以按以下方式查看。

#include <stdio.h>

int main(void)
{
char * alphabet[] =
{
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
"n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"
};

const size_t N = sizeof( alphabet ) / sizeof( *alphabet );

char **p_alphabet = alphabet + N / 2;

for ( size_t i = 0; i < N; i++ )
{
printf( "%2zu: %s\n", i,
i % 2 == 0 ? *( p_alphabet + i / 2 )
: *( p_alphabet - ( i + 1 ) / 2 ) );
}

return 0;
}

程序输出为

 0: n
1: m
2: o
3: l
4: p
5: k
6: q
7: j
8: r
9: i
10: s
11: h
12: t
13: g
14: u
15: f
16: v
17: e
18: w
19: d
20: x
21: c
22: y
23: b
24: z
25: a

关于arrays - 指向数组的指针,循环时每隔一段时间跳转一个索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67297346/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com