C语言中数组变量作为函数参数传值的两种方式:数组类型 指针类型 以及“C语言中数组变量(名)的本质是指针变量”

news2024/9/20 18:32:47

文章目录

    • Intro & Summary
    • Code & Output
      • 运行截图
      • Code
    • 关于数组长度在被调函数中的计算错误
      • 运行截图 & 警告信息
      • Code
    • 数组变量是一类特殊的、指向自己的指针变量

Intro & Summary

我在 main 函数中定义了一个数组,要将该数组作为参数传递给其他方法。那么被调用的方法如何声明?
两种:

void printArray1(int pArr[], int length);	// 数组变量的方式
void printArray2(int* pArr, int length);	// 指针变量的方式【推荐】

int main() {
    int array[] = {11, 22, 33, 44, 55};
    int length = sizeof(array) / sizeof(array[0]);
    printArray1(array, length);
    printArray2(array, length);
    return 0;
}

注意,C语言中数组作为函数参数时,数组长度无法在被调用函数中计算,所以必须在该函数的参数列表中同时传入数组的长度

另,记一句结论:C语言中数组变量(名)的本质其实是一个指针变量。

数组变量是一类特殊的、指向自己的指针变量

Code & Output

运行截图

在这里插入图片描述

Code

//
//  main.c
//  09-数组
//
//  Created by wuyujin1997 on 2023/1/28.
//

#include <stdio.h>
void printArray1(int pArr[], int length);
void printArray2(int* pArr, int length);

int main() {
    int array[] = {11, 22, 33, 44, 55};
    
    printf("==> main start\n");
    printf("sizeof(pArr) = %lu\n", sizeof(array));
    printf("sizeof(pArr[0]) = %lu\n", sizeof(array[0]));
    int length = sizeof(array) / sizeof(array[0]);
    printf("length = %d\n", length);
    for (int i = 0; i < length; i++) {
        printf("array[%d] = %d\t", i, array[i]);
    }
    printf("\n==> main end\n");
    
    printArray1(array, length);
    printArray2(array, length);
    return 0;
}

void printArray1(int pArr[], int length) {
    printf("\n==> printArray1(int pArr[], int specificLength) start\n");
    for (int i = 0; i < length; i++) {
        printf("array[%d] = %d\t", i, pArr[i]);
    }
    printf("\n==> printArray1(int pArr[], int specificLength) end\n");
}

void printArray2(int* pArr, int length) {
    printf("\n==> printArray2(int* pArr, int specificLength) start\n");
    for (int i = 0; i < length; i++) {
        printf("array[%d] = %d\t", i, pArr[i]);
    }
    printf("\n==> printArray2(int* pArr, int specificLength) end\n");
}
==> main start
sizeof(pArr) = 20
sizeof(pArr[0]) = 4
length = 5
array[0] = 11	array[1] = 22	array[2] = 33	array[3] = 44	array[4] = 55	
==> main end

==> printArray1(int pArr[], int specificLength) start
array[0] = 11	array[1] = 22	array[2] = 33	array[3] = 44	array[4] = 55	
==> printArray1(int pArr[], int specificLength) end

==> printArray2(int* pArr, int specificLength) start
array[0] = 11	array[1] = 22	array[2] = 33	array[3] = 44	array[4] = 55	
==> printArray2(int* pArr, int specificLength) end
Program ended with exit code: 0

关于数组长度在被调函数中的计算错误

运行截图 & 警告信息

Sizeof on array function parameter will return size of 'int *' instead of 'int[]'
'sizeof (pArr)' will return the size of the pointer, not the array itself

我们可以用 sizeof(数组名)sizeof(数组第一个元素) 两值相除得到数组的长度。
可以当把这个数组作为参数传到另一个方法的时候,在另一个方法中无法用同样的方法计算得出数组长度。
所以,必须在该函数的参数列表中同时传入数组的长度

下图中:在main方法中声明了数组,可以通过sizeof计算出数组长度:20字节。
可是当使用了两种方法传递数组到另一个被调函数之后,在被调函数内部可以发现sizeof拿不到数组的长度,而是单个指针变量的size。
Xcode的提示也很明确:'sizeof (pArr)' will return the size of the pointer, not the array itself,即sizeof(数组名)在此处返回的是指针变量的size,而非数组本身的size。
在这里插入图片描述
另外注意一下 Sizeof on array function parameter will return size of 'int *' instead of 'int[]' 会在什么时候出现:
方法参数中数组传递方式是int pArr[]而非int* pArr的时候,我们使用sizeof(pArr)才出现了这句警告。
在这里插入图片描述

Code

//
//  main.c
//  09-数组
//
//  Created by wuyujin1997 on 2023/1/28.
//

#include <stdio.h>
void printArray1(int pArr[], int length);
void printArray2(int* pArr, int length);

int main() {
    int array[] = {11, 22, 33, 44, 55};
    
    printf("==> main start\n");
    printf("sizeof(pArr) = %lu\n", sizeof(array));
    printf("sizeof(pArr[0]) = %lu\n", sizeof(array[0]));
    int length = sizeof(array) / sizeof(array[0]);
    printf("length = %d\n", length);
    for (int i = 0; i < length; i++) {
        printf("array[%d] = %d\t", i, array[i]);
    }
    printf("\n==> main end\n");
    
    printArray1(array, length);
    printArray2(array, length);
    return 0;
}

void printArray1(int pArr[], int specificLength) {
    printf("\n==> printArray1(int pArr[], int specificLength) start\n");
    printf("sizeof(pArr) = %lu\n", sizeof(pArr));
    printf("sizeof(pArr[0]) = %lu\n", sizeof(pArr[0]));
    int length = sizeof(pArr) / sizeof(pArr[0]);
    printf("length = %d\n", length);
    for (int i = 0; i < length; i++) {
        printf("array[%d] = %d\t", i, pArr[i]);
    }
    printf("\n==> printArray1(int pArr[], int specificLength) end\n");
}

void printArray2(int* pArr, int specificLength) {
    printf("\n==> printArray2(int* pArr, int specificLength) start\n");
    printf("sizeof(pArr) = %lu\n", sizeof(pArr));
    printf("sizeof(pArr[0]) = %lu\n", sizeof(pArr[0]));
    int length = sizeof(pArr) / sizeof(pArr[0]);
    printf("length = %d\n", length);
    for (int i = 0; i < length; i++) {
        printf("array[%d] = %d\t", i, pArr[i]);
    }
    printf("\n==> printArray2(int* pArr, int specificLength) end\n");
}

Output:

==> main start
sizeof(pArr) = 20
sizeof(pArr[0]) = 4
length = 5
array[0] = 11	array[1] = 22	array[2] = 33	array[3] = 44	array[4] = 55	
==> main end

==> printArray1(int pArr[], int specificLength) start
sizeof(pArr) = 8
sizeof(pArr[0]) = 4
length = 2
array[0] = 11	array[1] = 22	
==> printArray1(int pArr[], int specificLength) end

==> printArray2(int* pArr, int specificLength) start
sizeof(pArr) = 8
sizeof(pArr[0]) = 4
length = 2
array[0] = 11	array[1] = 22	
==> printArray2(int* pArr, int specificLength) end
Program ended with exit code: 0

数组变量是一类特殊的、指向自己的指针变量

证明过程见 https://blog.csdn.net/wuyujin1997/article/details/128783233?

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

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

相关文章

Lesson 4.3 梯度下降(Gradient Descent)基本原理与手动实现

文章目录一、梯度下降基本原理与学习率1. 数据背景与最小二乘法求解2. 一维梯度下降基本流程2.1 参数移动第一步2.2 梯度下降的多轮迭代3. 梯度下降算法特性与学习率二、梯度下降一般建模流程与多维梯度下降1. 多维梯度下降与损失函数可视化2. 梯度下降计算流程3. 二维梯度下降…

jvm学习的核心(四)---执行引擎和字符串

知识点总结于b站宋红康老师&#xff0c;视频链接 文章目录1.执行引擎1.1.执行引擎概述1.2.执行引擎的工作流程1.3.jvm的解释器和即时编译器&#xff08;JIT&#xff09;1.3.1.解释器&#xff0c;即时编译器概述1.3.2.常见即时编译器1.3.3.热点代码探测1.String Table1.1 string…

Go语言基础入门第三章

常量 常量是一个简单值的标识符&#xff0c;在程序运行时&#xff0c;不会被修改的量。 常量中的数据类型只可以是布尔型、数字型&#xff08;整数型、浮点型和复数&#xff09;和字符串型。 const identifier [type] value可以省略类型说明符[type]&#xff0c;因为编译器…

法律常识(三)《合同法》中的借款合同租赁合同摘录

目录 参考 一、借款合同 二、租赁合同 参考 中华人民共和国合同法 一、借款合同 第一百九十六条 借款合同是借款人向贷款人借款&#xff0c;到期返还借款并支付利息的合同。 第一百九十七条 借款合同采用书面形式&#xff0c;但自然人之间借款另有约定的除外。借款合同…

瑞吉外卖 对象转换器 公共字段自动填充 文件上传/下载

https://blog.csdn.net/weixin_43715214/category_12022798.html大佬记录项目介绍day01功能架构&#xff08;1&#xff09;用户层本项目中在构建系统管理后台的前端页面&#xff0c;我们会用到H5、Vue.js、ElementUI等技术。而在构建移动端应用时&#xff0c;我们会使用到微信小…

Red Giant Magic Bullet Suite介绍

Red Giant Magic Bullet Suite介绍什么是Magic Bullet SuiteMagic Bullet Suite功能介绍什么是Magic Bullet Suite Magic Bullet Suite是电影制作人不可或缺的一套调色降噪插件&#xff0c;它能够为您制作出和好莱坞一样的效果&#xff0c;为电影制作人提供专业的色彩校正。可…

excel函数应用:最简单的条件求和函数DSUM

SUM系列求和函数是我们日常工作中最常用的函数&#xff0c;相信大部分朋友对SUMIF、SUMIFS、SUMPRODUCT等函数都已经比较熟悉了。但是有一个求和函数大家可能都不熟悉&#xff0c;它就是DSUM函数&#xff0c;用于求数据库中记录的满足给定条件的的字段&#xff08;列&#xff0…

在中国社科院与美国杜兰大学金融管理硕士项目就读,重焕青春活力

在职场摸爬滚打多年后的你&#xff0c;是否有觉得内心疲惫&#xff1f; 是否进入到职场倦怠期&#xff1f;今天是春节后的首个工作日&#xff0c;新的一年意味着新的开始。你有想过在职继续攻读硕士学位吗&#xff1f;在中国社科院与美国杜兰大学金融管理硕士项目就读&#xff…

vue中实现打印

一、VUE 集成 LODOP插件打印 VUE 集成LODOP插件打印 Lodop、C-Lodop使用说明及样例 C-Lodop插件官网&#xff1a;功能演示 - Lodop和C-Lodop官网主站 参考文章&#xff1a;VUE 集成 LODOP插件打印_廷贺的博客-CSDN博客 二、winodw.print() 打印 print() 方法用于打印当前…

vs2015软件打包及常见问题解决方法

一、如程序文件是64位&#xff0c;而项目设置32位&#xff0c;打包项目编译时遇到如下问题 解决办法&#xff1a;选择打包程序项目的属性窗口设置TargetPlatform属性为对应的值&#xff0c;本项目的文件是64位的所以设置打包生成的程序为64位的&#xff0c;如下&#xff1a; …

【可解释性机器学习】排列重要性(Permutation Importance)及案例分析详解

Permutaion Importance&#xff1a;排列重要性引言工作原理代码示例排列重要性结果解读模型检验特征选择补充分析Partial Dependency PlotSharpley ValueLIME总结参考资料当训练得到一个模型之后&#xff0c;除了对模型的预测感兴趣之外&#xff0c;我们往往还想知道模型中哪些…

DDOS渗透与攻防(三)之socktress攻击

系列文章 DDOS渗透与攻防(一)之拒绝服务攻击概念介绍 DDOS渗透与攻防(二)之SYN-Flood攻击 socktress攻击 攻击协议原理介绍说明-socktress 2008年有Jack C.Louis发现&#xff0c;针对TCP服务的拒绝服务攻击&#xff1a; 消耗被攻击目标系统资源&#xff0c;与攻击目标建立…

xml配置JedisUtil

一.背景 习惯了Bean注解方式往sping容器中注入对象&#xff0c;现使用xml方式注入Bean对象总结下&#xff0c;顺便用帮女朋友解决的Jedis问题当做案例来总结。 二.配置JedisPool 从源码来看&#xff0c;JedisPool的构造函数有N多种 我们使用如下的构造函数来实例化JedisPool…

docker部署Nginx和Tomcat

文章目录 前言 目录 文章目录 前言 一、docker部署Nginx 二、docker部署Tomcat 总结 一、docker部署Nginx 下载镜像&#xff1a;docker pull nginx 后台运行镜像 -d 后台运行 --name"nginx01" 给容器命名 -p 宿主机端口:容器内部端口 docker run -d --name"…

2.SpringAop的jdkcglib动态代理xml注解实现切面

1.Spring 的 AOP 简介 1.1 什么是 AOP AOP 为 Aspect Oriented Programming 的缩写&#xff0c;意思为面向切面编程&#xff0c;是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 AOP 是 OOP 的延续&#xff0c;是软件开发中的一个热点&#xff0c;也是…

Linux常用命令——rsync命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) rsync 远程数据同步工具 补充说明 rsync命令是一个远程数据同步工具&#xff0c;可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步&#xff0c…

ARMv8 AArch64异常处理机制概览

1 处理机制概述 相对于ARMv7中的异常向量表&#xff08;Exception Vector Table&#xff09;&#xff0c;ARMv8异常处理机制更为复杂&#xff0c;涉及处理器的异常等级&#xff08;Exception Levels, ELn&#xff09;、运行状态&#xff08;Execution States&#xff09;和安全…

汉字乱码状态下的编码转换将导致的问题

实验工具notepad编辑器实验过程步骤1&#xff1a;打开notepad&#xff0c;新建一个文本文件&#xff0c;在其中输入一段汉字文本&#xff0c;查看当前编码格式&#xff0c;如下&#xff1a;分析&#xff1a;由上图可见&#xff0c;从右下角可知当前文件是以UTF-8解码显示的&…

微信小程序——页面事件,.启用下拉刷新监听页面的下拉刷新事件,上拉触底事件,停止下拉刷新的效果

一.页面事件1.什么是下拉刷新下拉刷新是移动端的专有名词&#xff0c;指的是通过手指在屏幕上的下拉滑动操作&#xff0c;从而重新加载页面数据的行为。2.启用下拉刷新启用下拉刷新有两种方式&#xff1a;a.全局开启下拉刷新在 app.json 的window 节点中&#xff0c;将 enableP…

python 蓝桥杯 矩阵拼接

问题描述已知 3 个矩形的大小依次是 a_{1} \times b_{1}, a_{2} \times b_{2}a1b1,a2b2 和 a_{3} \times b_{3}a3b3 。用这 3 个矩形能拼 出的所有多边形中, 边数最少可以是多少?例如用 3 \times 232 的矩形&#xff08;用 A 表示)、 4 \times 141 的矩形 (用 BB 表示) 和 2 \…