我有这个代码应该找到数组中的最小整数。我正在学习如何在C中使用指针,我的代码将无法编译,但我不知道为什么。我不想回答问题,而是想知道我为什么做错了,或者我的思维过程是怎么回事。
我认为*p_min
会返回地址内的值。
我得到的错误:
error: invalid type argument of ‘unary *’ (have ‘int’)
Warning: return makes pointer from integer without a cast
p在函数外声明为int * p;
代码:
int *find_smallest(int a[], int N)
{
int *p_min;
for (p = &a[0]; p < &a[N]; p++)
{
if (*p[1] < *p[0]) {
p_min = &p[1];
return *p_min;
} else {
p_min = &p[0];
return *p_min;
}
}
}
答案 0 :(得分:4)
不确定你在比较逻辑上做了什么。最直接的方法是从第一个元素开始,然后按顺序检查其余元素,保留较小元素的索引。我的代码是这样的:
int *find_smallest(int a[], int N)
{
/* Make sure the input is valid */
if (a && N > 0)
{
int i, N_min = 0;
/* Check the rest of the elements */
for (i = 1; i < N; i++)
{
/* If this one is lower, save the index */
if (a[i] < a[N_min])
N_min = i;
}
/* Return pointer to minimum */
return a + N_min;
}
/* Return NULL to indicate an error */
return NULL;
}
答案 1 :(得分:0)
*p[1] < *p[0]
应为*(p+1) < *p
或p[1] < p[0]
。int
。p
。&a[i]
可以写为a+i
。p[0]
(又名*p
)和*p_min
,而不是p[0]
和p[1]
。p[1]
甚至可能超出阵列的末尾!p_min
。int* p_min;
代替int min;
。修正:
int find_smallest(int a[], int N) {
int min = a[0]; // Assumes a[] will have at least one element.
for (int* p=a; p<a+N; ++p) {
if (*p < min) min = *p;
}
return min;
}
或者只是:
int find_smallest(int a[], int N) {
int min = a[0]; // Assumes a[] will have at least one element.
for (int* p=a; N--; ++p) {
if (*p < min) min = *p;
}
return min;
}
或者,可以使用索引而不是指针。
int find_smallest(int a[], int N) {
int min = a[0]; // Assumes a[] will have at least one element.
for (int i=0; i<N; ++i) {
if (a[i] < min) min = a[i];
}
return min;
}
或者只是:
int find_smallest(int a[], int N) {
int min = a[0]; // Assumes a[] will have at least one element.
for (int i=N; i--; ) {
if (a[i] < min) min = a[i];
}
return min;
}
答案 2 :(得分:-4)
此代码存在许多问题(以及需要改进的地方)。这很令人困惑,所以我不完全确定你要做什么,但我会指出你应该开始的一些地方。
find_smallest(int a[], int N)
将无法执行*,您需要find_smallest(int (*a)[], int N);
之类的内容,然后您可以像(*a)[some_index]
一样访问。int *
,但我看到的return
两个值int
。p
在哪里宣布?&a[0]
而不只是a[0]
,如果你所做的只是找到数组中的最小值?*a[some_index]
。看起来你打算按照我的说法通过它。以*a[some_index]
访问它会导致各种错误,您需要编写(*a)[some_index]
之类的内容。这就是C如何识别指针。*p_min
,你都不应该将return
放在if语句中,因为它只会减慢编译器的速度浪费空间。 *如果您像int a[]
一样传递它,该函数将只有变量的本地副本,并且无法修改它。这会导致很多令人困惑的错误,所以如果你想把你的函数发展成更大的东西,这是需要考虑的事情。