我正在尝试CS50 PSET4 有人可以解释为什么第一个有效而不是第二个?
基本上我所做的是,我在第一个循环外面声明了char *颜色,并在第二个中的所有if语句中声明了char *颜色。
当我在if语句
之外声明char *时,这是有效的 void initBricks(GWindow window)
{
char* colour;
// TODO
for(int i=0,y=20;i < ROWS; i++)
{
y+= 30;
for(int j=0,x=5,c=0;j < COLS; j++)
{
if(i==0)
colour = "RED";
if(i==1)
colour = "BLUE";
if(i==2)
colour = "CYAN";
if(i==3)
colour ="ORANGE";
if(i==4)
colour = "GRAY";
GRect brick = newGRect(x,y,30,15);
setFilled(brick,true);
setColor(brick, colour);
add(window, brick);
x+= 40;
}
}
}
但是当我在所有if语句中声明char *时,这不起作用
void initBricks(GWindow window)
{
// TODO
for(int i=0,y=20;i < ROWS; i++)
{
y+= 30;
for(int j=0,x=5,c=0;j < COLS; j++)
{
if(i==0)
char *colour = "RED";
if(i==1)
char *colour = "BLUE";
if(i==2)
char *colour = "CYAN";
if(i==3)
char *colour ="ORANGE";
if(i==4)
char *colour = "GRAY";
GRect brick = newGRect(x,y,30,15);
setFilled(brick,true);
setColor(brick, colour);
add(window, brick);
x+= 40;
}
}
}
我对指针相当新,但到目前为止,我有点理解,char *相当于一个字符串,它指向变量的地址,颜色,在这种情况下。
但是,当我在'&'
中使用它时,我不确定为什么我不必放入setColor(brick, colour)
(引用运算符)。
答案 0 :(得分:1)
要了解为什么第二组代码不起作用,将其视为:
可能会有所帮助 if (i==0) {
char *colour = "RED";
}
if (i==1) {
char *colour = "BLUE";
}
您可以更容易地看到colour
的声明仅扩展到块的末尾,以便在执行下一个语句时colour
不再存在。
至于你的第二个问题,setColor
只使用colour
的值(已经是指针),所以不需要传递对它的引用。 setcolor
可以在没有引用的情况下访问字符串。
答案 1 :(得分:0)
第二个集合不起作用的原因是你试图修改C中不允许的字符串文字(char * color =“foo”)。
顺便说一下,两个版本都有未定义的行为,你应该考虑使用所有-W标志进行编译。