我正在处理来自C for Scientists and Engineers的以下作业问题:
Given the following declarations and assignments, what do these expressions evaluate to?
int a1[10] = {9,8,7,6,5,4,3,2,1}
int *p1, *p2;
p1 = a1+3;
Line 14: p2 = *a1[2];
我正在尝试使用gcc编译此代码,但是当我这样做时,它会给我以下错误:
w03_3_prob15.c: In function 'main':
w03_3_prob15.c:14:7: error: invalid type argument of unary '*' (have 'int')
我正在使用以下命令进行编译:
gcc -o w03_3_prob15 w03_3_prob15.c -std=c99
我真的不知道该怎么做。您对如何解决此错误有任何想法吗?
答案 0 :(得分:7)
该行无法编译,因为它在本书中不正确。来自author's Errata page:
Page 438, line 17 from the bottom.
p2 = *a1[2];
should be p2 = &a1[2];
答案 1 :(得分:2)
p2 = *a1[2];
在C中,一元*
仅为指针定义。 p2
是int*
。 a1
是int[]
。 a1[2]
是int
。 []
的优先级高于一元*
,因此您拥有*(a1[2])
,这不是一个合法的表达方式。这就是编译器暂停的原因。
我可以想到两个可能的解决方案。你想要哪一个,取决于你想要做什么。
*p2 = a1[2]; // Assigns the value of the second int in the array to the location
// pointed to by p2.
p2 = &a1[2]; // Assigns the location of the second int in the array to p2.
答案 2 :(得分:1)
p2
的类型为int*
。 a1[2]
的类型为int
,因此*a1[2]
毫无意义。你确定你完全复制了作业问题吗? (如果是这样,那么糟糕的家庭作业问题就会发生。)