首页 > 编程语言 >程序设计部分 指针(三) 第1关:指针作为函数参数

程序设计部分 指针(三) 第1关:指针作为函数参数

时间:2024-08-07 13:24:33浏览次数:15  
标签:arr const 常量 int 函数参数 数组 程序设计 指针

任务描述
本关任务:计算一个数组中除最大数字之外的数字之和。

相关知识
指针形参
指针既然也是一种数据类型,自然也可以作为函数的形式参数。一般使用指针来让函数能修改外部内容,或者传递体积比较大的内容,比如:

void Swap(int *a,int *b)
{
    int t = *a;
    *a = *b;
    *b = t;
}
int main()
{
    int a = 10,b = 20;
    Swap(&a,&b);
    cout <<a << endl << b << endl;
}
得到的结果是:
20
10

实现了两个变量的交换。

数组形参
之前说到数组作为形参时,第一个维度是可以省略长度的,这实际上是因为数组形参会被变成其元素指针类型,比如:

void Func(int a1[],int a2[][10]); //等价于 void Func(int *a1,int (*a2)[10])
通过sizeof运算符也可以发现这一点:

void Size(int arr[10][10])
{
    cout << sizeof(arr) << endl;
}
int main()
{
    int arr[10][10];
    Size(arr);
    cout << sizeof(arr) << endl;
}
得到的结果是:
4
400

4是因为输出的是指针,而400则因为输出的是数组。

常量指针
有时候我们只想让别的代码读取指针所指数据,而不想让它写入,这个时候就可以用常量指针了。

常量指针虽然说是指向常量的指针,但其实可以指向变量,比如:

int a = 0;
const int b = 0; //一个整型常量
const int *ptr; //声明一个常量指针
ptr = &b; //指向一个常量
ptr = &a; //指向一个变量,也是可以的
cout << *ptr << endl; //只是读取,正确
*ptr = 1; //尝试写入,错误!
将常量指针用在形参上,就可以防止函数修改指针所指的内容,常用于字符串,比如:

void Print(const char *str) //字符串常量指针,只允许读
{
    cout << str << endl;
    str[0] = 'h'; //错误!
}
int main()
{
    char str[] = "Hello";
    Print(str); //变量传递给常量,没问题
    str[0] = 'h'; //在这里可以随意修改
}
另外,需要注意的是常量指针说的是指向一个常量,不能修改的是所指向对象的内容,指针本身是可以修改。与此对应的是指针常量,比如:

int a,b;
const int *p1 = &a; //常量指针
p1 = &b; //正确
*p1 = 0; //错误
int * const p2 = &b; //指针常量,只能初始化
p2 = &b; //错误
p2 = &a; //错误
*p2 = 0; //正确
const int * const p3 = &a; //指向常量的指针常量,等于上面两种之和
编程要求
右侧编辑器中有一个函数Sum,它有两个参数arr和len,代表一个数组和这个数组的长度。

请在这个函数中补充代码,计算除数组最大元素之外其他元素的和,并将其输出,占一行。

注意:如果数组长度为0,则结果也是0。

输入数据由评测系统读取,并传递给Sum函数。具体见测试说明。

测试说明
平台会对你编写的代码进行测试:

测试输入:
5
1 2 3 7 9
预期输出:
13

测试输入:
4
1 2 4 4
预期输出:
3

每组输入有两行,第一行是数组的长度,第二行是数组的内容。
 

参考代码

#include <iostream>

using namespace std;

void Sum(const int * arr, int len) {
  /**********   Begin   **********/
  if (len == 0) {
    printf("0\n");
    return;
  }

  int max = arr[0];
  int sum = 0;

  // 找到数组中的最大值  
  for (int i = 0; i < len; i++) {
    if (arr[i] > max) {
      max = arr[i];
    }
  }

  // 计算所有元素的总和,并同时减去所有等于最大值的元素  
  for (int i = 0; i < len; i++) {
    sum += arr[i];
    if (arr[i] == max) {
      sum -= max;
    }
  }

  // 输出结果  
  printf("%d\n", sum);
  /**********   End   **********/
}

标签:arr,const,常量,int,函数参数,数组,程序设计,指针
From: https://blog.csdn.net/Whovian_Z/article/details/140989368

相关文章

  • 程序设计部分 指针(三) 第2关:指针作为函数返回值
    任务描述本关任务:读取数据建立数组。相关知识指针作为函数返回值指针能作为函数参数,自然也能作为函数的返回值。不过需要注意的是,返回的指针不应该指向函数的局部变量,因为局部变量只在函数这一次被调用期间有效,如果返回了指向局部变量的指针,又在之后的程序中访问了这个指针......
  • 程序设计部分 函数的递归 第4关:使用递归进行自动分析
    任务描述本关任务:计算逆波兰表达式的值。相关知识放苹果问题把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?注意:5,1,1和1,5,1是同一种分法。我们可以先假设有一个函数count(m,n)能告诉我们m个苹果放n个盘子有多少种放法,然后在此基础上进行......
  • Java程序设计:Java IO(2)
    目录1实验名称2实验目的3实验源代码4实验运行结果图5总结1实验名称   JavaIO2实验目的    继续熟练掌握在eclipse中调试代码    掌握Java IO中流的基本概念及使用方法    掌握文件锁、Scanner解析文件的使用方法3实验源代......
  • Java程序设计:Java IO
    目录1实验名称2实验目的3实验源代码4实验运行结果图5总结1实验名称   JavaIO2实验目的    继续熟练掌握在IDEA中调试代码    掌握File类的基本使用    掌握Java IO中流的基本概念及使用方法    掌握文件IO流、缓冲流......
  • 使用 Flask 和 Yolov2 在 uLong32 中使用区域指针检测 2024 年奥林匹克数据集中的浮动
    你好StackOverflow!!!c:我正在使用#Yolov2和embedded#CVSSfordetecting浮动UIeleme#any视频对象实例中的ntse;在eexampl......
  • 重头开始嵌入式第十三天(指针那些事儿)
    昨天给指针开了个头,今天就正式开始指针的归纳总结了,指针是c语言的特点,可以说没有学指针,就不算学了c,昨天说了指针的概念,定义及使用,今天来讲解一下指针的进阶用法目录指针变量的初始化野指针指针的作用指针与一维数组指针的运算指针迭代写法的排序查找插入排序冒泡排序......
  • 利用指针来升序数组,(冒泡排序)
    我们写完数组后,通过写函数来是代码清晰明了,第一个升序函数,通过传入arr与len,再用冒泡排序的方法即可将数组升序,这里注意,传入arr,也就是数组的首地址,函数用Int*arr接受,这里传入首地址,也就是指针的方法,这个首地址(指针)允许函数内部通过数组索引的方法来访问数组中的其他元素,......
  • 面向对象程序设计——第3章 案例
    案例一水仙花数案例要求【案例目标】用户通过键盘输入一个整数值,判断该数值是否为“水仙花数”。【相关解释】“水仙花数”是指一个3位数,其各位数的三次方和等于该数本身。例如:水仙花例如:153是一个“水仙花数”,因为【案例效果】本案例程序运行的结果如图【具体要......
  • 深圳大学-Java程序设计实验-常用集合类使用
    实验目的熟悉集合类的应用,熟悉String类的应用以及正则表达式的使用。实验内容1张三、李四等人是A社团成员,李四、王五等人是B社团成员,编写一个Java应用程序(要求使用集合类),输出参加A社团的人、参加B社团的人、以及同时参加两个社团的人。在报告中附上程序截图、完整的运行......
  • C:指针学习(1)-学习笔记
    目录前言:知识回顾:1、const1.1const修饰普通变量1.2 const修饰指针变量1.3总结:2、指针运算2.1指针+-整数2.2指针-指针2.3指针的关系运算3、指针的使用结语:前言:距离上一次更新关于初识指针的内容已经有一段时间了,本文旨在继续深入探讨指针的相关知识。在......