C 如何使函数返回指针?

C 如何使函数返回指针?,c,arrays,pointers,C,Arrays,Pointers,此函数应返回一个指针,指向数组中第一个出现的最大整数,而不使用索引运算符。它可以找到并打印最大的int,但是如何使它返回指针呢?我如何测试它是否成功 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;

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

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;
}

编辑:应该使用大小,但我不确定如何包含它。

我猜不出大小是用来做什么的

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

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

这很有效。您检测到最大的数字,就像您检测到的一样,然后再次运行相同的循环以查看数字的位置,然后返回该地址。我还将一些数据类型从
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);
}
#包括
#包括
常数int*arr\u first\u max(常数int*a){
常数int*k;
int最大=0;
对于(k=a;*k!='\0';k++){
如果(*k>最大值){
最大=*k;
} 
}
对于(k=a;*k!='\0';k++){
如果(*k==最大值){
返回k;
}
}
}
int main(){
int nums[6]={7,2,1,5,4,6};
const int*y=arr_first_max(nums);
printf(“%d\n”,*y);
}

在所有函数中,假定
n
>0

只需保留逻辑,而不是存储max,而是将索引存储到max,以便返回指向该索引处数组的指针

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;
}
既然我误读了这个问题,一个递归的奖励

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));

另一个答案假设:

  • n
    是数组
    a
    的长度(以元素而不是字节为单位)
  • 您希望遍历整个数组
    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;
    }
    
    假定

    • 函数的签名正确且完整(
      arr\u first\u max
      暗示在数组中搜索第一个max元素)
    • 因此,
      int*a
      是指向第一个元素的指针(即相当于签名中的
      int a[]
      );在这种情况下,我将保留
      const
      说明符,不过我认为如果练习允许,您可以省略/放弃它
    • size\u 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;
    }
    
    int*arr\u first\u max(常数int*a,大小n){
    int*最大,*k;
    对于(最大=k=a;(k-a)*最大)
    最大=k;
    回报最大;
    }
    
    这是因为我引用了C编程语言:

    指针减法也有效:如果
    p
    q
    指向
    同一个数组,
    p将最大值更改为
    int*
    ,并在数组中保留一个指针,而不是将值保留在数组中。为什么要将int与char进行比较<代码>*k!='\0'
    对于(k=a;*k;k++)它可以像这样
    冗余参数
    size\u t n
    返回
    Maximum
    是一个局部变量,在函数终止时将从堆栈中释放。因此,它将返回无效或未经授权的内存地址。如果您的数据集包含零,并且最大的元素在此之后已就位,则它将找不到最大的元素。
    a
    以null结尾的假设没有充分的根据。传递size参数是有原因的。我想知道
    size\u t n
    是否是
    a
    数组的大小。以null结尾的int数组看起来很奇怪。也许他要找的是
    ,而(n-)
    ?在整个数组中继续迭代?谁knows@StoryTeller,我同意你的看法,但那是问题中提到的。我没有idea@milevyoOP说现在他不清楚如何使用
    n
    。因此,在循环中使用它来迭代并停止检查
    '\0'
    。为了得到准确的答案:-)@milevyo,你的答案是脆弱的代码,任何人(更不用说OP)都不应该遵循。不要抓鱼,教他们如何自己钓鱼。你的意思肯定是“空”:@StoryTeller是的:P我最近在基于Java的环境中写了太多东西:/I明白你为什么要进行理智检查,而不是:)我只想补充一件事。因为
    size\u t
    是无符号的(实现已定义,但无符号)。小于零的检查是不必要的。@StoryTeller你也在那里。大小\u t保证为正。我在想什么?刚刚删除了行。根据问题,不允许使用下标运算符。谢谢!更新了答案。
    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;
    }