再学C语言37:函数、数组和指针

news2024/9/23 11:21:25

编写一个对数组进行操作的函数,并进行调用

一般形式举例:

int sum(int * arr, int n); // 函数原型
                           // 第一个参数把数组地址和类型信息传递给函数
                           // 第二个参数把数组中元素的个数传递给函数

int main(void)
{
    ...
    int total;
    total = sum(array_t, 10);
    ...
    return0;
}

int sum(int *arr, int n)
{
    int i;
    int temp;

    for(i = 0; i < 20; i++)
    {
        temp += arr[i];
    }
    return temp;
}

在函数原型或函数定义头的场合中(只有在这两种场合),可以用int *arr代替int arr[]

int sum(int arr[], int n);

无论在任何情况下,形式int *arr都表示arr是指向int的指针

由于数组名就是数组首元素的地址,因此如果实际参数是一个数组名,则形式参量必须是与之相匹配的指针

// 四种等价的函数原型
int sum(int * arr, int n);
int sum(int *, int);
int sum(int arr[], int n);
int sum(int [], int);

// 两种等价的函数定义
int sum(int * arr, int n)
{
    ...
}
int sum(int arr[], int n)
{
    ...
}

一、指针参数的使用

使用数组的函数需要知道数组何时开始和结束

向函数传递数组信息的2种方法:

1)使用一个指针参量确定数组的开始点(同时确定数组中数据的类型信息),使用一个整数参量指明数组的元素个数

2)传递两个指针,第一个指针指明数组的起始地址,第二个指针指明数组的结束地址

示例代码:

#include <stdio.h>

#define SIZE 10

int sum1(int * arr, int n);
int sum2(int * start, int * end);

int main(void)
{
    int array_test[SIZE] = {2, 3, 8, 1, 12, 20, 5, 13, 55, 6};
    int acc1, acc2;

    acc1 = sum1(array_test, SIZE);
    acc2 = sum2(array_test, array_test + SIZE);

    printf("the total num of array_test by sum1 is: %d \n", acc1);
    printf("the total num of array_test by sum2 is: %d \n", acc2);
}

int sum1(int *arr, int n) // 第一种方法
{
    int temp = 0;
    int i;
    for(i = 0; i < n; i++)
    {
        temp += arr[i];
    }
    return temp;
}

int sum2(int * start, int * end) // 第二种方法
{
    int temp = 0;
    while(start < end) // end实际指向的位置在数组最后一个元素之后
                       // C保证在为数组分配存储空间时,指向数组之后的第一个位置的指针也是合法的
                       // 这种“越界”指针可使函数调用的形式更整洁
    {
        temp += * start;
        start++; // start是指向int的指针,加1时增加的是一个int的大小
    }
    return temp;
}

运行结果:

二、指针和数组

处理数组的函数实际上是使用指针作为参数的

编写处理数组的函数时,数组符号和指针符号都可以选用

指针符号(尤其是对其使用增量运算符时)更接近于机器语言,使某些编译器在编译时可生成更高效率的代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/171503.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分分钟你也能写一个自己需要的 Chrome 扩展程序

废话 对于chrome浏览器想必大家大不陌生了&#xff0c;里面的扩展程序&#xff08;本文后面称插件&#xff09;&#xff0c;多多少少也都用过吧&#xff0c;毕竟可以辅助自己的日常工作&#xff0c;娱乐等等&#xff0c;添加完之后呢&#xff0c;就会多出一些操作按钮&#xf…

年度总结-你觉得什么叫生活?

陈老老老板&#x1f9b8;&#x1f468;‍&#x1f4bb;本文专栏&#xff1a;生活&#xff08;主要讲一下自己生活相关的内容&#xff09;&#x1f468;‍&#x1f4bb;本文简述&#xff1a;生活就像海洋,只有意志坚强的人,才能到达彼岸。&#x1f468;‍&#x1f4bb;上一篇文章…

Linux常用命令——tr命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) tr 将字符进行替换压缩和删除 补充说明 tr命令可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符&#xff0c;经常用来编写优美的单行命令&#xff0c;作用很强大。 语法 tr(选…

云逗猫——直播弹幕控制机械臂逗猫棒

这个东西思路是很简单的。简单来说在直播画面用文字跟观看者约定一些弹幕指令&#xff0c;然后用爬虫爬取直播弹幕&#xff0c;当爬到弹幕是约定的指令时&#xff0c;通过串口给舵机控制板发送信号&#xff0c;控制板控制舵机转动&#xff0c;机械臂就会做相应的动作。 猫 两…

Lesson2无头单向非循环链表(中)

1.链表 1.1链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 1.2链表的分类 实际中链表的结构非常多样&#xff0c;以下情况组合起来就有8种链表结构&#xff1a; 1.…

【SAP Hana】X档案:SAP HANA 数据库基础知识

SAP HANA 数据库基础知识1、基本规则&#xff08;1&#xff09;注释&#xff08;2&#xff09;标识符&#xff08;3&#xff09;引号&#xff08;4&#xff09;保留字2、数据类型&#xff08;1&#xff09;日期时间类型&#xff08;2&#xff09;数字类型&#xff08;3&#xf…

SNMP简单网络管理协议

随着网络的规模越来越庞大&#xff0c;网络中的设备种类繁多&#xff0c;如何对越来越复杂的网络进行有效的管理&#xff0c;从而提供高质量的网络服务&#xff0c;已成为网络管理所面临的巨大挑战。网络的管理和运维手段多样&#xff0c;下面将对几种常见的网管与运维手段展开…

[leetcode.29]两数相除,位运算虽好,不要满眼是她

题目如下 不允许用乘除法&#xff0c;但是我们可以用加减法和位运算。。。不过这里不要用位运算&#xff0c;比如说你要是想用补码交替除法&#xff0c;你根本无法获得移动几位&#xff08;移动31位&#xff1f;太鬼畜了吧&#xff09; 所以说单纯的除法部分&#xff0c;我们可…

测试开发 | 实战演练基于加密接口测试测试用例设计

image1080594 76.4 KB 如果接口测试仅仅只是掌握一些requests或者其他一些功能强大的库的用法&#xff0c;是远远不够的&#xff0c;还需要具有根据公司的业务以及需求去定制化一个接口自动化测试框架能力。所以在这个部分&#xff0c;会主要介绍接口测试用例分析以及通用的流程…

从零开始 verilog 以太网交换机(二)MAC接收控制器的设计与实现

从零开始 verilog 以太网交换机&#xff08;二&#xff09;MAC接收控制器的设计与实现 &#x1f508;声明&#xff1a; &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN主页 &#x1f9e8; 从零开始 verilog 以太网交换机系列专栏&#xff1a;点击这里 &#x1f511;未经作者允…

plt绘制点线图 点(marker)过密的解决办法

设置 markevery10 plt.plot(x, y, markero, markevery10) import matplotlib.pyplot as plt import numpy as npxnp.arange(0,2*np.pi,0.01) ynp.sin(x)fig, ax plt.subplots(constrained_layoutTrue)plt.title(markevery10)ax.plot(x, y, markero, markevery50, mfcr,mecr)…

(小甲鱼python)函数笔记合集四 函数(IV)总结 函数中参数的作用域 局部作用域 全局作用域 global语句 嵌套函数 nonlocal语句等详解

一、基础复习 函数的基本用法 创建和调用函数 函数的形参与实参等等函数的几种参数 位置参数、关键字参数、默认参数等函数的收集参数*args **args 解包参数详解 二、函数中参数的作用域 作用域&#xff1a;一个变量可以被访问的范围&#xff0c;一个变量的作用域总是由它在代…

jQuery学习-01jQuery下载安装

1 jQuery的介绍 jQuery就是js函数库&#xff0c;里面有大量的js函数库&#xff0c;使用这些函数操作dom对象&#xff0c;做事件&#xff0c;动画&#xff0c;ajax处理&#xff1b; 地址&#xff1a;https://jquery.com/ 2下载 地址&#xff1a;https://jquery.com/download/…

Apache Solr 9.1-(一)初体验单机模式运行

Apache Solr 9.1-&#xff08;一&#xff09;初体验单机模式运行 Solr是一个基于Apache Lucene的搜索服务器&#xff0c;Apache Lucene是开源的、基于Java的信息检索库&#xff0c;Solr能为用户提供无论在任何时候都可以根据用户的查询请求返回结果&#xff0c;它被设计为一个强…

day12-继承

1. 继承 1.1 继承的实现&#xff08;掌握&#xff09; 继承的概念 继承是面向对象三大特征之一&#xff0c;可以使得子类具有父类的属性和方法&#xff0c;还可以在子类中重新定义&#xff0c;以及追加属性和方法 实现继承的格式 继承通过extends实现格式&#xff1a;class 子…

【算法题】1318. 或运算的最小翻转次数

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 题目&#xff1a; 给你三个正整数 a、b 和 c。 你可…

Webpack:HTML Webpack Plugin插件

HTML Webpack Plugin插件&#xff0c;在Webpack构建的前端项目中&#xff0c;用于简化index.html文件的创建&#xff0c;以免除项目打包之后手动创建/拷贝index.html到打包目录下的繁琐步骤。以下&#xff0c;从一个已构建好的Vue项目中的一个现象谈起&#xff0c;逐步深入了解…

vs code中的platformIO插件,完成Arduino的程序编写,导入,安装开发板管理库

准备工作 vs code已经安装好&#xff0c;扩展插件plateformIO也安装好。&#xff08;下图是platformIO安装方式&#xff09; platformIO界面功能介绍和简单使用 新建Arduino项目 选择正确的开发板型号&#xff0c;和自己习惯的编译框架。打开后有一个.ini的配置文件&#x…

MySQL表的增删改查(初级)

MySQL数据库最核心的内容就是增删改查&#xff08;即CURD&#xff09;,看了这篇初级增删改查的博客之后可以解决以后工作中百分之80-90的内容&#xff0c;这部分的知识并不是很难&#xff0c;但是需要一定的熟练程度&#xff1b;C&#xff1a;create--新增U&#xff1a;update-…

设计模式_行为型模式 -《策略模式》

设计模式_行为型模式 -《策略模式》 笔记整理自 黑马程序员Java设计模式详解&#xff0c; 23种Java设计模式&#xff08;图解框架源码分析实战&#xff09; 概述 先看下面的图片&#xff0c;我们去旅游选择出行模式有很多种&#xff0c;可以骑自行车、可以坐汽车、可以坐火车、…