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

pointer to an array, jumps an index every other time while looping

我试图将一个指针指向数组的中间,然后使用算法在该特定中间值之前和之后循环索引,该算法工作正常,但是当我尝试在指向一个,我的索引跳了1个数字,更准确地说,如果我们认为我们的指针指向索引[0],我可以使用索引[0]的值,然后它转到索引[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', '[=22=]' }.

的字符数组存储在内存中

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

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

{ 'm', '[=15=]', 'n', '[=15=], 'o', '[=15=]', ..., 'x', '[=15=]', 'y', '[=15=]', 'z', '[=15=]' }

并且这些值在您的 for 循环中输出。值 '[=24=]' 不是图形符号。所以你在输出中看不到它。

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

#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