您能否解释一下为什么会通过执行以下C代码来输出:';d';?(指针)

您能否解释一下为什么会通过执行以下C代码来输出:';d';?(指针),c,pointers,C,Pointers,根据以下代码,我的输出是d c b a,但它是错误的。为什么 char xc[4] = {'a', 'b', 'c', 'd'}; char *xp[4]; int i; for (i = 0; i < 4; i++) { xp[i] = &xc[i]; } for (i = 0; i < 4; i++) { *xp[i] = *xp[3-i]; } printf("%c %c %c %c", xc[0], xc[1], xc[2],

根据以下代码,我的输出是
d c b a
,但它是错误的。为什么

char xc[4] = {'a', 'b', 'c', 'd'};
char *xp[4];

int i;
for (i = 0; i < 4; i++) {     
    xp[i] = &xc[i];
}

for (i = 0; i < 4; i++) {     
    *xp[i] = *xp[3-i];
}

printf("%c %c %c %c", xc[0], xc[1], xc[2], xc[3]);
charxc[4]={'a','b','c','d'};
char*xp[4];
int i;
对于(i=0;i<4;i++){
xp[i]=&xc[i];
}
对于(i=0;i<4;i++){
*xp[i]=*xp[3-i];
}
printf(“%c%c%c%c”,xc[0],xc[1],xc[2],xc[3]);

对于
i=0
xc[0]
被修改并具有值
d
。对于
i=1
,修改了
xc[1]
,并具有值
c
。此时
a
b
已不再位于
xc
数组中的任何位置。
现在,您正在使用
xc[0]
xc[1]
的值分别修改变量
xc[3]
xc[2]
。输出将是

d c c d 

循序渐进

您的代码相当于

char xc[4] = {'a', 'b', 'c', 'd'};

int i;

for (i = 0; i < 4; i++) {
    xc[i] = xc[3-i];
}

printf("%c %c %c %c", xc[0], xc[1], xc[2], xc[3]);
您应该使用临时变量,并小心地交换同一对两次以反转数组

char xc[4] = {'a', 'b', 'c', 'd'};
char *xp[4];

int i;
for (i = 0; i < 4; i++) {
    xp[i] = &xc[i];
}

for (i = 0; i < 3-i; i++) {
    char t = *xp[i];
    *xp[i] = *xp[3-i];
    *xp[3-i] = t;
}

printf("%c %c %c %c", xc[0], xc[1], xc[2], xc[3]);
charxc[4]={'a','b','c','d'};
char*xp[4];
int i;
对于(i=0;i<4;i++){
xp[i]=&xc[i];
}
对于(i=0;i<3-i;i++){
字符t=*xp[i];
*xp[i]=*xp[3-i];
*xp[3-i]=t;
}
printf(“%c%c%c%c”,xc[0],xc[1],xc[2],xc[3]);

在第二个循环中,您希望使用
xp
的初始值来反转它们,但是当您到达数组的中间时,您已经修改了以下值

声明一个临时变量,并更改打印,以便打印
xp
,而不是
xc

char xc[4] = {'a', 'b', 'c', 'd'};
char *xp[4];
char temp;
int i;

for (i = 0; i < 4; i++) {     
    xp[i] = &xc[i];
}

for (i = 0; i < 4; i++) {  
    temp = *xp[i];   
    *xp[i] = *xp[3-i];
    *xp[3-i] = temp;
}

printf(“%c %c %c %c”, xp[0], xp[1], xp[2], xp[3]);
charxc[4]={'a','b','c','d'};
char*xp[4];
焦炭温度;
int i;
对于(i=0;i<4;i++){
xp[i]=&xc[i];
}
对于(i=0;i<4;i++){
温度=*xp[i];
*xp[i]=*xp[3-i];
*xp[3-i]=温度;
}
printf(“%c%c%c%c”,xp[0],xp[1],xp[2],xp[3]);
不太复杂。。。 如果为展开第二个
,它会:

*xp[0] = *xp[3]; // xc[0] receive 'd' value, so xc array is now {'d', 'b', 'c', 'd'}
*xp[1] = *xp[2]; // xc[1] receive 'c' value, so xc array is now {'d', 'c', 'c', 'd'}
*xp[2] = *xp[1]; // xc[2] receive 'c' value, no change
*xp[3] = *xp[0]; // xc[3] receive 'd' value, no change

在循环的前两次迭代之后

for (i = 0; i < 4; i++) {     
    *xp[i] = *xp[3-i];
}
如果要反转数组,则循环可以如下所示

char xc[4] = {'d', 'c', 'c', 'd'};
size_t i;
size_t n = sizeof( xp ) / sizeof( *xp );

for ( i = 0; i < n / 2; i++ ) 
{
    char c = *xp[i];      
    *xp[i] = *xp[n-i-1];
    *xp[n-i-1] = c;
}
char xc[4] = {'d', 'c', 'b', 'a'};
也就是说,需要将数组前半部分的字符与数组后半部分的字符交换

char xc[4] = {'a', 'b', 'c', 'd'};
char *xp[4];

int i;
for (i = 0; i < 4; i++) {
    xp[i] = &xc[i];
}

for (i = 0; i < 3-i; i++) {
    char t = *xp[i];
    *xp[i] = *xp[3-i];
    *xp[3-i] = t;
}

printf("%c %c %c %c", xc[0], xc[1], xc[2], xc[3]);
使用这种方法,您可以编写一个通用函数。比如说

#include <stdio.h>

void reverse( char s[], size_t n )
{
    size_t i;

    for ( i = 0; i < n / 2; i++ )
    {
        char c = s[i];
        s[i] = s[n-i-1];
        s[n-i-1] = c;
    }
}    

int main( void ) 
{
    char xc[] = { 'a', 'b', 'c', 'd' };

    printf( "%c %c %c %c\n", xc[0], xc[1], xc[2], xc[3] );

    reverse( xc, sizeof( xc ) / sizeof( *xc ) );

    printf( "%c %c %c %c\n", xc[0], xc[1], xc[2], xc[3] );
}    

在一张纸上写出第二个循环每次迭代时发生的情况。我不使用MS Word,这只是来自网站的任务使用调试器-逐步执行。这不好,因为此代码中的
temp
没有将值存储在
xc
中,并且
xc
中的一些值将消失。除了
temp==xp[i]中重复的
=
之外,新代码看起来不错和无效的字符和字符串文本。@谢谢,我编辑了它。”。我从Mangomeri的初始代码中复制了它。
a b c d
d c b a