您能否解释一下为什么会通过执行以下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