我正在尝试CS50 PSET4 .
有人可以解释为什么第一个有效而不是第二个吗?
本质上,我所做的是,我在第一个循环外部声明 char* color,并在第二个循环的所有 if 语句内声明 char* color。
当我在 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* 相当于一个字符串,在本例中它指向变量 color 的地址。
但是,我不确定为什么在 setColor(brick, color)
中使用 '&'
(引用运算符)时不必输入它>。
最佳答案
要了解为什么第二组代码不起作用,将其视为以下内容可能会有所帮助:
if (i==0) {
char *colour = "RED";
}
if (i==1) {
char *colour = "BLUE";
}
您可以更容易地看到,colour
的声明仅扩展到 block 的末尾,因此执行下一条语句时,colour
不再存在。
至于你的第二个问题,setColor
仅使用colour
的值(它已经是一个指针),因此不需要传递对其的引用。 setcolor
无需引用即可访问字符串。
关于CS50 PSET4 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30831902/