C语言进阶教程(再论指针和数组3)

news2024/11/17 21:29:40

文章目录

  • 前言
  • 一、a和&a的区别
  • 二、数组作为函数参数
  • 总结


前言

本篇文章继续讲解指针和数组。

一、a和&a的区别

1.数组名(例如 a)表示整个数组。当使用数组名时,它会被解释为对整个数组的引用。例如,可以使用 a[0] 来访问数组的第一个元素。

2.&a 表示对数组的地址的引用,即指向整个数组的指针。使用 &a 时,它将返回指向数组的指针,类型为指向数组的指针类型(例如,int (*)[])。该指针指向数组在内存中的起始位置。

示例代码:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char** argv)
{
    int a[5] = {1, 2, 3, 4, 5};

    printf("a : %p \n", a);
    printf("a + 1 : %p \n", a + 1);
    printf("&a + 1 : %p \n", &a + 1);


    return 0;
}

运行结果:
在这里插入图片描述
从运行结果来看a + 1的地址偏移量是一个元素的大小,&a + 1的偏移量则是整个数组的大小。

二、数组作为函数参数

在C语言中,当数组作为函数参数传递时,它会自动退化为指向数组首个元素的指针。这种数组到指针的转换称为数组的退化。

当数组作为函数参数传递时,实际上传递的是数组的首个元素的地址,而不是整个数组。在函数内部,该参数被解释为指向数组的指针。这意味着在函数中无法得知原始数组的长度,只能通过其他方式传递数组的长度信息。

以下是一个示例来说明数组作为函数参数时的退化现象:

#include <stdio.h>

void printArraySize(int arr[]) {
  int size = sizeof(arr) / sizeof(arr[0]);
  printf("Array size inside function: %d\n", size);
}

int main() {
  int arr[] = {1, 2, 3, 4, 5};

  int size = sizeof(arr) / sizeof(arr[0]);
  printf("Array size in main function: %d\n", size);

  printArraySize(arr);

  return 0;
}

输出结果:

Array size in main function: 5
Array size inside function: 2

如上所示,虽然在 main 函数中计算数组 arr 的大小是正确的(5个元素),但在 printArraySize 函数中,通过 sizeof(arr) / sizeof(arr[0]) 计算得到的结果却是2。这是因为在函数参数中,arr 实际上是一个指针类型,所以 sizeof(arr) 返回的是指针大小,而不是整个数组的大小。

要注意的是,尽管在函数内部无法直接获取数组的元素个数,但可以通过其他方式将数组的长度作为额外的参数传递给函数,以便在函数内部使用。这样可以确保在函数中正确处理数组的元素个数。

总结起来,数组作为函数参数时会退化为指向数组首个元素的指针。在函数内部,无法直接获取数组的长度,需要采取其他方式传递数组的长度信息。

总结

本篇文章就讲解到这里。

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

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

相关文章

Cadence Allegro PCB设计88问解析(二十九) 之 Allegro中泪滴的使用

一个学习信号完整性仿真的layout工程师 通常添加泪滴的目的是&#xff1a;在一些接插器件或者大焊盘的时候&#xff0c;增强信号线与焊盘之间的连接强度&#xff0c;提高可靠性&#xff1b;二是为了保持高速信号的阻抗连续性&#xff0c;防止阻抗突变等&#xff0c;造成信号完整…

2023年杭州/广州/深圳NPDP产品经理认证线上班报名

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

【数据存储概念】大端存储小端存储

这里写目录标题 大小端介绍大端小端存储的特征如何判断大小端 大小端介绍 本文采用整形来举列子说明大端存储和小端存储的区别及原理 特别注意&#xff1a;大小端模式是指字节序的大小端模式&#xff0c;当一个数据的所占的内存大于一个字节时&#xff0c;就会按照大端或小端…

vscode配置eigen3

目录 1. 头文件包含 2. c_cpp_properties.json 3. CMakeList.txt 4. 完整代码 1. 头文件包含 // Eigen 核心部分 #include <Eigen/Core> // 稠密矩阵的代数运算&#xff08;逆&#xff0c;特征值等&#xff09; #include <Eigen/Dense> 2. c_cpp_properties.…

Linux部署: (根据进程号自动关闭jar程序)或jenkins自动化部署

目录 1. 简单部署方式 1.1 在项目部署位置 1.2 上传需要启动的jar包 复制包名 ps: 注意: 打包时候需添加build依赖 1.3 特别注意一下jar包需要添加的配置和依赖 1.4 根据此jar包名字进行编写shell脚本(启动) 1.5 编写shell脚本关闭(通过进程号关闭) 1.6 vim shutdown…

基于Python+Dlib+OpenCV个人换脸应用智能实现(深度学习+机器视觉)含全部工程源码及视频演示(仅供个人学习,请勿商用)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境相关库包安装 模块实现1. 准备数据2. 提取面部标记3. 调整脸部对齐4. 混合图像5. 校正颜色6. 转换函数7. 交互式界面设计 系统测试工程源代码下载其它资料下载 前言 本项目利用Dlib提供的机器学习、数值计算、图…

Linux远程管理工具

在使用远程管理工具之前&#xff0c;应先设置宿主机 Windows 与虚拟机 Linux 能够连通。这里要注意 VMware 的网卡设置&#xff0c;Linux 中更改网络设置可以使用 ifconfig 和 setup 命令&#xff0c;若还是无法进行远程连接&#xff0c;要么就是 SSH 服务没有启动&#xff0c;…

Vlan(Access、Trunk、Hybrid)与ARP(免费ARP)讲解

目录 Vlan讲解 Vlan标签 二层接口类型 ARP ARP的作用 ARP地址解析报文讲解 免费ARP报文讲解 ARP缓存表 Vlan讲解 Vlan&#xff08;Virtual Local Area Network&#xff09;虚拟局域网&#xff0c;将一个物理的LAN在逻辑上划分为多个广播域&#xff1b;可以理解为一个V…

【MySql】MySql视图

文章目录 视图概念基本使用创建视图修改视图对基表有影响修改基表对视图有影响删除视图 视图规则和限制OJ题目 视图概念 视图就是一张虚拟表&#xff0c;其内容由查询定义。与真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化影响到基表&#xff0…

[Web程序设计]实验: 开发工具使用

一、实验目的 &#xff08;1&#xff09;掌握web应用运行所必须的服务端软件使用。 &#xff08;2&#xff09;掌握web应用开发所必须的开发工具使用。 二、实验内容 Tomcat的安装及使用&#xff1b;使用idea开发一个简单的web应用。 三、实验要求 &#xff08;1&#xf…

baichuan-7B的测试教程

1.百川模型介绍 baichuan-7B不仅在C-Eval、AGIEval和Gaokao中文权威评测榜单上,以显著优势全面超过了ChatGLM-6B等其他大模型,并且在MMLU英文权威评测榜单上,大幅领先LLaMA-7B。baichuan-7B是由百川智能开发的一个开源的大规模预训练模型。基于Transformer结构,在大约1.2万…

【Linux】详解进程控制 ( fork函数 | 写时拷贝 | 进程退出 | 进程等待 )

fork函数fork函数初识fork返回值问题fork常规用法 写时拷贝进程退出进程退出码进程退出场景进程如何退出 进程等待僵尸进程进程等待的方法 fork函数 fork函数初识 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而…

第42步 深度学习图像识别:Mobilenet建模(Tensorflow)

基于WIN10的64位系统演示 一、写在前面 &#xff08;1&#xff09;Mobilenet MobileNet是谷歌研究团队于2017年发布的一种轻量级的深度学习网络架构。这种架构特别适用于移动设备和嵌入式设备上&#xff0c;因为它的模型体积小&#xff0c;计算量少&#xff0c;但又能保持相…

无人船实时路径规划与编队控制仿真研究

源自&#xff1a;系统仿真学报 作者&#xff1a;宋大雷 干文浩 许嘤枝 曲秀青 曹江丽 摘 要 安全和无碰撞导航是无人船正常航行的基础。通过Unity3D构建高保真的虚拟海洋环境&#xff0c;在无人船建模基础上&#xff0c;提出一种面向未知复杂环境的实时路径规划及编队控…

系统空间数据库设计

文章目录 1 .空间数据库2. 空间数据库实体结构属性与空间数据库关联设计 1 .空间数据库 系统空间数据库存储电力管线设备和管网各业务图的地理空间信息&#xff0c; GIS 服务器GeoServer 通过读取空间数据库的实体表中的空间信息确定地物类的位置和几何形状&#xff0c;然后将…

全志V3S嵌入式驱动开发(spi-nor image制作和烧入)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 其实&#xff0c;我们之前就讨论过怎么把image烧入到v3s的spi-nor当中去。当时使用的方法是借助于sunxi-fel工具&#xff0c;烧入的image也比计较小…

重磅:微前端与模块联邦项目落地

微前端概念及诞生背景 微前端的出现背景可以追溯到大型前端应用的开发和维护过程中所面临的挑战和问题。 大型应用的复杂性&#xff1a;随着前端应用规模的扩大&#xff0c;应用的复杂性也增加。大型应用通常由多个团队协同开发&#xff0c;每个团队负责一部分功能模块&#x…

干货 | 智能网联车个人数据流通安全要求

以下内容整理自清华大学《数智安全与标准化》课程大作业期末报告同学的汇报内容。 我们对相关已有的标准规范进行调研&#xff0c;在工业和信息化部办公厅印发的《车联网网络安全和数据安全标准体系建设指南》中规定了六个部分的安全要求&#xff0c;我们做的主要是个人信息保护…

MaskFormer:将语义分割和实例分割作为同一任务进行训练

目标检测和实例分割是计算机视觉的基本任务&#xff0c;在从自动驾驶到医学成像的无数应用中发挥着关键作用。目标检测的传统方法中通常利用边界框技术进行对象定位&#xff0c;然后利用逐像素分类为这些本地化实例分配类。但是当处理同一类的重叠对象时&#xff0c;或者在每个…

c++11 标准模板(STL)(std::basic_streambuf)(五)

定义于头文件 <streambuf> template< class CharT, class Traits std::char_traits<CharT> > class basic_streambuf; 类 basic_streambuf 控制字符序列的输入与输出。它包含下列内容并提供到它们的访问&#xff1a; 1) 受控制字符序列&#xff…