2015-11-29 26 views
-2

该函数应该返回一个指针,指向数组中最大的int的第一次出现,而不使用索引操作符。它可以找到并打印最大的int,但是如何使它返回一个指针?我如何测试它是否成功?C - 如何使函数返回一个指针?

int *arr_first_max(const int *a, size_t n) { 
    const int *k; 
    int largest = 0; 
    for (k = a; *k != '\0'; k++) { 
     if (*k > largest) { 
      largest = *k; 
     } 
    } 
    printf("%d\n", largest); 
    return &largest; 
} 

编辑:size_t n应该被使用,但我不知道如何包括它。

+0

将最大更改为'int *',而不是将值保留在数组中,而是将指针保留在数组中。 –

+0

你为什么要将int与char进行比较? '* k!='\ 0''可能就像这样'for(k = a; * k; k ++)' – milevyo

+0

冗余参数'size_t n' – manetsus

回答

-1

我不会猜测什么size_t n

int *arr_first_max(int *a, size_t n) { 

    int *largest = a; 
    while(*a){ 
     a++; 
     if(*a>*largest) largest=a; 
    } 
    return largest; 
} 
+1

假设'a'是空终止的是没有根据的。有一个大小参数传递的原因。 – StoryTeller

+1

我想知道'size_t n'是否是'a'数组的大小。以null结尾的int数组看起来很不可思议。也许他正在寻找的是'while(n - )'?继续遍历整个数组?谁知道 –

+0

@StoryTeller,我同意你的看法,但是问题中发布的是什么。我不知道 – milevyo

0

这工作。你检测到最大的数字就像你一样,然后再次运行相同的循环,看看数字在哪里然后返回该地址。我还将一些数据类型从int更改为const int,并且我删除了第二个参数,因为您正在检查空字符。

#include <stdio.h> 
#include <stdlib.h> 

const int *arr_first_max(const int *a) { 
    const int *k; 
    int largest=0; 
    for (k = a; *k != '\0'; k++) { 
    if (*k > largest){ 
     largest = *k; 
    } 
    } 
    for (k = a; *k != '\0'; k++) { 
    if (*k == largest){ 
    return k; 
    } 
    } 
} 

int main(){ 
    int nums[6]={7,2,1,5,4,6}; 
    const int* y=arr_first_max(nums); 
    printf("%d\n", *y); 
} 
1

在所有功能n被假定为>0

只是保持你的逻辑,但不是存储最大值,而是将索引存储到最大值,以便返回指向该索引处数组的指针。

int *arr_first_max(const int *a, size_t n) { 
    int i,l; 
    for (l=i=0 ; i<n ; i++) 
    if (a[i] > a[l]) l = i; 
    return a+l; 
} 

这确实n-1迭代

const int *arr_first_max(const int *a, size_t n) { 
    const int *most; 
    for (most=a++ ; --n ; a++) if (*a > *most) most = a; 
    return most; 
} 

而且因为我误解了问题,递归奖金编辑指针唯一版本(基于评论)!

const int *arr_first_max_r(const int *most, const int *a, size_t n) { 
    if (*a > *most) most = a; 
    return --n ? arr_first_max_r(most, ++a, n) : most; 
} 

被称为像这样

printf("Biggest int is : %d\n", *arr_first_max_r(a, a, n)); 
+0

根据问题不允许使用下标运算符。 – Elyasin

+0

谢谢!更新了答案。 –

2

而另一个答案假设:

  1. n是阵列a的长度(以单元为单位,而不是字节)
  2. 你想遍历整个阵列a

然后代码是:

const int *arr_first_max(const int *a, size_t n) { 
    const int *largest = a; 
    while(n--) { 
     if(*a>*largest) 
     largest = a; 
     a++; 
    } 
    printf("%d\n", *largest); 
    return largest; 
} 
+1

当然你的意思是“NULL”:) – StoryTeller

+0

@StoryTeller是的:P我最近在基于Java的环境中写了太多:/ –

+1

我明白了为什么你想要一个理智检查,比:) 我只是添加还有一件事。由于'size_t'是无符号的(实现定义的,但没有签名)。小于零的检查是不必要的。 – StoryTeller

0

假设

  • 函数的签名是正确和完整的(arr_first_max暗示您在用于第一最大元素的数组搜索)
  • 因此int* a是指向第一个元素的指针(即相当于签名中的int a[]);我将离开const符在这种情况下,虽然我想你可以省略/丢弃,如果锻炼允许那些
  • size_t n是数组的大小,或者换句话说,数组中元素的个数
  • 要返回一个指针数组中的最大元素,而无需使用标[]操作

那么这将是一个解决方案

int *arr_first_max(const int *a, size_t n) { 
    int *largest, *k; 
    for (largest = k = a; (k - a) < n; k++) 
     if (*k > *largest) 
      largest = k; 
    return largest; 
} 

这是因为我从C编程语言引述如下:

指针减法也是有效的:如果pq指向的 相同的阵列元件,和p<q,然后q-p+1是元件从 p数到q(含)。