可以使代码工作(编译、运行而不会崩溃,并产生连贯、可解释的答案),但您需要与所选结构不同的结构。例如:
#include <stdio.h>
struct my_structure
{
char *i;
};
#define EXPR(x) #x, x
int main(void)
{
char strings[][10] = { { "Winter" }, { "Bash" }, { "Is" }, { "Here" } };
struct my_structure variables[] = { { strings[0] }, { strings[1] }, { strings[2] }, { strings[3] } };
struct my_structure *p = variables;
printf("%10s: %s\n", EXPR(++p->i));
printf("%10s: %s\n", EXPR(p++->i));
printf("%10s: %d\n", EXPR(*p->i++));
printf("%10s: %d\n", EXPR(*p->i++));
printf("%10s: %d\n", EXPR((*p->i)++));
printf("%10s: %d\n", EXPR(*p++->i));
return 0;
}
生成输出:
++p->i: inter
p++->i: inter
*p->i++: 66
*p->i++: 97
(*p->i)++: 115
*p++->i: 116
宏 EXPR 只允许我不重复代码中的表达式,但将字符串形式和值都放入对 printf() 的调用中。
当事情开始时,p->i 指向字符串"Winter"。
-
++p->i: inter — 将指针 p->i 预递增,使其指向 Winter 的 i。
-
p++->i: inter — 后递增指针p(指向"Bash"),但结果与之前相同,因为递增在使用p->i 后生效。
-
*p->i++: 66 — 后递增指针 p->i(因此它指向 Bash 中的 a)并报告在递增之前指向的值,即 B(ASCII 中的 66)。
-
*p->i++: 97 — 相同的表达式,但指针在增量之前指向 a (97),在增量之后指向 s。
-
(*p->i)++: 115 — 增加p->i 指向的字母,报告s,但将其更改为t。
-
*p++->i: 116 — 后增量 p 因此它指向字符串“In”,同时报告 t (116)。
这里有更多仪器的替代方案:
#include <stdio.h>
struct my_structure
{
char *i;
};
#define EXPR(x) #x, x
int main(void)
{
char strings[][10] = { { "Winter" }, { "Bash" }, { "Is" }, { "Here" } };
struct my_structure variables[] = { { strings[0] }, { strings[1] }, { strings[2] }, { strings[3] } };
struct my_structure *p = variables;
for (size_t i = 0; i < sizeof(strings)/sizeof(strings[0]); i++)
printf("strings[%zu] = [%s]\n", i, strings[i]);
for (size_t i = 0; i < sizeof(variables)/sizeof(variables[0]); i++)
printf("variables[%zu].i = [%s]\n", i, variables[i].i);
printf("%10s: %s\n", EXPR(p->i));
printf("%10s: %s\n", EXPR(++p->i));
printf("%10s: %s\n", EXPR(p->i));
printf("%10s: %s\n", EXPR(p++->i));
printf("%10s: %s\n", EXPR(p->i));
printf("%10s: %d\n", EXPR(*p->i++));
printf("%10s: %s\n", EXPR(p->i));
printf("%10s: %d\n", EXPR(*p->i++));
printf("%10s: %s\n", EXPR(p->i));
printf("%10s: %d\n", EXPR((*p->i)++));
printf("%10s: %s\n", EXPR(p->i));
printf("%10s: %d\n", EXPR(*p++->i));
printf("%10s: %s\n", EXPR(p->i));
for (size_t i = 0; i < sizeof(strings)/sizeof(strings[0]); i++)
printf("strings[%zu] = [%s]\n", i, strings[i]);
for (size_t i = 0; i < sizeof(variables)/sizeof(variables[0]); i++)
printf("variables[%zu].i = [%s]\n", i, variables[i].i);
return 0;
}
及其输出:
strings[0] = [Winter]
strings[1] = [Bash]
strings[2] = [Is]
strings[3] = [Here]
variables[0].i = [Winter]
variables[1].i = [Bash]
variables[2].i = [Is]
variables[3].i = [Here]
p->i: Winter
++p->i: inter
p->i: inter
p++->i: inter
p->i: Bash
*p->i++: 66
p->i: ash
*p->i++: 97
p->i: sh
(*p->i)++: 115
p->i: th
*p++->i: 116
p->i: Is
strings[0] = [Winter]
strings[1] = [Bath]
strings[2] = [Is]
strings[3] = [Here]
variables[0].i = [inter]
variables[1].i = [th]
variables[2].i = [Is]
variables[3].i = [Here]
使用此方案的变体(例如,额外的括号)以确保您了解发生了什么。