指向数组的指针,循环时每隔一段时间跳转一个索引
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
我试图将一个指针指向数组的中间,然后使用算法在该特定中间值之前和之后循环索引,该算法工作正常,但是当我尝试在指向一个,我的索引跳了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