C语言——对数组名的理解

C——浅析数组名的含义 在C语言中,数组有着极其重要的地位,它不仅是一种存放同一类型数据的集合,而且和指针也有着一定的关联。在这其中,数组名的含义与使用也是有一定学问的,总体来说可以概括为以下两点: 1. sizaeof()和取地址&后面单独跟数组名,此时数组名代表整个数组; 2. 除以上两种情况外,数组名表示数组首元素的地址; 接下来我将通过展示一些实例来帮助大家更好地理解和使用数组名。 1 一维整型数组的相关内容 第一组代码如下: 对于上面的5行代码,我们逐个分析: 1)因为a是一个整型的一维数组 阅读详情

一、数组名的理解

在C语言中,数组名可以被理解为指向数组首元素的指针。这意味着,当你使用数组名时,它会被自动转换为指向数组首元素的指针,即数组的第一个元素的地址。

以下是关于数组名的理解和用法:

  1. 数组名是常量:一旦数组被声明,其名称就是一个常量指针,指向数组的第一个元素。此时不能修改数组名的值,也不能将其赋值给其它数组名。
  2. 数组名与指针的区别:虽然数组名类似于指针,但它们之间有一些重要的区别。例如,数组名不能递增或递减,而指针可以。
  3. 使用数组名访问元素:你可以使用数组名来访问数组中的元素。例如,arr[0]和*arr是等价的,都是访问数组的第一个元素。
  4. sizeof运算符:当你对数组名使用sizeof运算符时,它返回整个数组的字节数,而不是指针的字节数。这是因为数组名指向整个数组,而不仅仅是指向单个元素的指针。
  5. 数组名作为函数参数:当你将数组名作为函数参数传递时,它会被自动转换为指向数组首元素的指针。因此,函数参数可以声明为指针类型或者数组类型,但它们在函数内部的行为会略有不同。

以下是关于数组名使用的简单示例:

#include<stdio.h>
//关于数组名的简单使用

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

	printf("&arr[0] = %p\n", &arr[0]);//数组首元素的地址
	printf("arr = %p\n", arr);//数组首元素的地址
	printf("&arr = %p\n", &arr);//数组的地址

	int len = sizeof(arr);
	printf("sizeof(arr) = %d\n", len);//整个数组的字节数

	return 0;
}

运行结果如下图所示:

 

我们需要注意的是:arr和&arr是不同的

观察以下代码:

#include<stdio.h>
//关于数组名的简单使用

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

	printf("arr = %p\n", arr);//数组首元素的地址
	printf("&arr = %p\n", &arr);//数组的地址

	printf("arr+1 = %p\n", arr + 1);//跳过了一个整型的字节数
	printf("&arr+1 = %p\n", &arr + 1);//跳过了一个数组的字节数

	return 0;
}

运行结果如下图所示:

通过运行结果我们可以发现:

arr+1跳过的是一个整型的字节数

&arr+1跳过的是一个数组的字节数

二、使用指针访问数组

在C语言中,我们可以使用指针来访问数组的元素。可以通过以下步骤来实现:

  1. 声明指针变量:首先,我们需要声明一个指针变量,用来存储数组的地址。
  2. 将指针指向数组:将指针指向数组的首元素。这可以通过指针变量初始化为数组名,或者将其设置为数组名的地址来实现。
  3. 使用指针访问数组元素:一旦指针指向了数组的首元素,我们就可以通过指针进行数组元素的访问。这可以通过指针的算术运算或者间接引用来完成。
#include<stdio.h>
//使用指针访问数组
int main()
{
	int arr[5] = { 0 };
	int len = sizeof(arr) / sizeof(arr[0]);
	int* p = arr;//&arr[0]

	for (int i = 0; i < len; i++)
	{
		sacnf("%d", &arr[i]);
		//等价于:
		//scanf("%d", arr + i);
		//scanf("%d", p + i);
	}

	for (int i = 0; i < len; i++)
	{
		printf("%d ", arr[i]);
		//等价于:
		//printf("%d ", *(arr + i));
		//printf("%d ", *(p + i));
		//printf("%d ", p[i]);
	}

	return 0;
}

三、一维数组传参的本质 

 在C语言中,一维数组作为函数参数传递的本质是传递数组的地址(即数组首元素的地址)。这意味着,当你将一个一维数组作为参数传递给函数时,实际上传递给函数的是数组首元素的地址,而不是整个数组的副本。

具体来说,当你声明一个函数并将一个数组作为参数传递时,该数组会被自动转换为指向其首元素的指针。因此,函数参数实际上是一个指向数组首元素的指针,而不是数组本身。这使得函数能够访问和操作原始数组中的元素,而无需进行复制,从而提高了程序的效率和内存利用率。

这种传递数组地址的方式还意味着,对数组元素的修改在函数内部是可以影响到原始数组的。这是因为函数内部使用的是原始数组的地址,所以对数组元素的任何改变都会直接反映到原始数组中。

以下是一个简单示例,演示了如何将一维数组作为函数参数传递:

#include <stdio.h>

// 函数原型,接受一个整型数组作为参数
void printArray(int arr[], int size) 
{
    for (int i = 0; i < size; i++) 
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

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

    // 调用函数,传递数组作为参数
    printArray(myArray, 5);

    return 0;
}

我们需要注意的是:不能在函数内部计算数组的元素个数 。数组名是数组首元素的地址,那么在数组传参的时候,本质上传递的是数组首元素的地址。想要在函数内部对数组长度进行计算时,sizeof(arr)计算的是一个元素的大小而不是数组的大小。

注:一维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。

 更多C语言相关练习:test_c: C语言练习,包括常见语法练习以及小项目练习。 (gitee.com)

第一章 什么是数组名?----一个让你吃惊的事实!         数组是指针的基础,多数人就是从数组的学习开始指针的旅程的。下面我节选一些在各种论坛和文章里经常见到的关于数组的文字:“一维数组是一级指针”“二维数组是二级指针”“数组名可以作为指针使用”“数组名就是..........的常量指针”“数组名就是..........的指针常量”..................................这些文字看起来非常熟悉吧?类似的文字还有许 阅读详情

相关推荐

从Wi-Fi到蓝牙:手把手教你用Cadence Virtuoso搭建一个2.4GHz锁相环频率综合器(含PFD/CP/VCO模块设计)

本文详细介绍了如何在Cadence Virtuoso中设计一个2.4GHz锁相环频率综合器(PLL),涵盖从系统架构到模块级设计的全流程。重点解析了PFD、CP和VCO等核心模块的设计技巧与仿真验证方法,帮助模拟集成电路设计师掌握高频PLL的实现要点,满足Wi-Fi和蓝牙等无线通信标准的要求。

weixin_30315723的博客 417

数组名是什么?

数组名是什么?

m0_68246456的博客 1万+

编译hive-3.1.3(3.0.0)和编译tez-0.10.2适配hadoop-3.3.4以及hadoop-3.2.2(附安装包)

编译hive-3.1.3(3.0.0)和编译tez-0.10.2适配hadoop-3.3.4以及hadoop-3.2.2(附安装包)

2301_77356579的博客 2596

C语言中数组名到底是什么?

C语言中数组名在表达式中被解读为指向数组首元素的指针,C语言不存在多维数组。 C语言中数组名在表达式中被解读为指向数组首元素的指针, 即数组名在表达式中值为数组首元素的地址。(但有个例外,int a[2];int (*pa)[2]; pa=&a;此时a解读为指向数组的指针,而不是指向数组首元素的指针)。 例如,int a[2];在表达式中a表示数组首元素地址; 再例如,int a[3][2......

liugan528的博客 1万+

Zabbix华为交换机光衰告警

zabbix使用自动发现监控huawei网络设备光衰

qq_31651649的博客 4529

TensorRT-LLM.V1.1.0rc0:在无 GitHub 访问权限的服务器上编译 TensorRT-LLM 的完整实践

1.NGC上的预构建发布容器进行部署,见《2.通过pip进行部署。3.从源头构建再部署。在实际开发中,我们常常面临这样的场景:本地笔记本为 Windows 系统,虽然可以访问 GitHub,但受限于硬件性能,编译大型项目(如 TensorRT-LLM)耗时过长;而公司或实验室提供的 Linux 服务器性能强劲,适合编译任务,但却因网络策略限制无法连接外网,尤其是无法访问 GitHub。。

xinvictory的专栏 1202

数组名到底是不是指针

#include <stdio.h> #include <string.h> int main(void) { int a[3] = { 1, 2, 3 }; printf("%d\n", *a);//结果为1。此时数组名看起来又像是一个指针,但是却不能对这个指针进行++操作。 此时可能产生疑问,好像数组名在不作为函数参数的时候也能当作指针使用?那么为什么说数组名作为函数参数的时候才退化为指针呢。 实际上,数组名是这样使用的:数组名是一个指针,但是一个指针常量,其是一...

qq_39224221的博客 8359

海思Hi3061M MCU:为高速吹风筒市场注入智能动力

此外,海思还提供了丰富的软件开发工具和生态环境组件,帮助开发者快速实现复杂功能。高速吹风筒因其高效的风力和快速的干燥效果,近年来在市场上越来越受欢迎。然而,传统的高速吹风筒在性能、噪音和使用寿命等方面仍有改进的空间。凭借其高性能、低功耗、低噪声和易用的开发工具,为高速吹风筒市场带来了全新的解决方案。这不仅提高了用户的使用体验,还延长了电机的使用寿命。这不仅减少了电机的电磁噪声,还提高了电机的运行效率。还支持风机顺逆风启动适配多种电阻范围的电机,进一步提高了吹风筒的适用性和灵活性。

2401_83448585的博客 2016

C语言数组名的理解

一维数组、二维数组、字符数组关于数组名的理解

2402_89035880的博客 1272

Python爬虫实战:用Playwright+Transformer做财经新闻事件驱动分析,我靠它抓住了算力政策的涨停机会

对我来说,这套系统最大的价值不是抓住了几次涨停,而是把“看新闻→分析→决策”的全流程自动化、量化了——不用再被股吧的情绪带偏,不用再熬夜刷新闻,而是用数据和模型做理性判断。更重要的是,搭建这套系统的过程,我吃透了Playwright动态爬虫、Transformer文本分析、量化数据对接这些核心技能,这些技能不管是做量化、做数据分析师,还是做其他领域的爬虫,都能用得上。现在打开PyCharm,跟着代码跑一遍,你也能从海量财经新闻里,挖出属于自己的事件驱动信号——与其靠感觉炒股,不如靠数据说话。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1391

Cadence Orcad Capture原理图断线的检查与避免方法

在设计电路图中,尤其是直接借鉴别人的设计进行二次开发的过程中难免会遇到如下尴尬的情况。有没有眼神好的朋友发现图纸的哪里有不对劲的地方呢?

fydar的博客 3267

【C语言】数组名及其地址的理解与应用

C语言作为一种底层编程语言,强大之处在于它可以直接操作内存。数组作为一种常见的数据结构,在C语言中被广泛使用。数组名的理解和使用,对于掌握指针、内存管理等底层概念具有重要意义。本文将通过实际代码与分析,帮助读者更深入理解C语言中数组名的本质及其与数组元素地址的关系,并通过具体例子探讨如何正确地使用数组名以及指针操作。 2025.2.7-✍27min

禅宗里有一个词叫做“因缘和合”。 所谓因缘,是指事件要发生所必须的条件。因缘和合就是当你聚集了这件事的一切条件,它就会自然而然的发生。“它就会自然而然的发生”,这种朴素而坚定的价值观让我们感到无比安心,安心到可以不用有任何担心焦虑。 776

11、体内皮质功能的电压敏感染料成像技术

本文详细介绍了电压敏感染料成像(VSDI)技术在体内皮质功能研究中的应用。内容涵盖VSDI的技术起源、作用机制、信号特点与解读局限性,以及其在映射感觉皮质功能区方面的优势。文章对比了VSDI与电极记录和钙成像技术的差异,突出了其在高时空分辨率下监测神经元群体亚阈值活动的独特价值。同时,提供了完整的实验操作流程,包括手术步骤、染料应用、光学系统配置及数据分析方法,并总结了常见问题及其解决方案。随着基因靶向和多模态技术结合的发展,VSDI有望进一步提升信号特异性和空间精度,成为解析大脑网络动态的重要工具。

Apple的专栏 79

【C语言入门级教学】数组名的理解

这就要学习数组传参的本质了,在数组传参的时候,传递的是数组名,也就是说本质上数组传参传递的是数组⾸元素的地址。这个代码搞明⽩后,我们再试⼀下,如果我们再分析⼀下,数组名arr是数组⾸元素的地址,可以赋值给p,其实数组名arr和p在这⾥是等价的。&数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素的地址是有区别的)数组元素的访问在编译器处理的时候,也是转换成⾸元素的地址+偏移量求出元素的地址,然后解引⽤来访问的。数组名如果是数组⾸元素的地址,那下⾯的代码怎么理解呢?

王璐WL的博客 2804

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C语言中数组名的理解

C语言中数组名的理解 数组名并不能当做一个变量,可以认为它只是一种简记缩写(当然是被编译器认可的一种简记缩写), 而且在不同的运用环境中,数组名的含义不尽相同。如下代码中:

bingmayong02的专栏 1176

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

对C语言数组中数组名和指针的一些理解

1).二维数组中&a , a , a[0] , &a[0] , &a[0][0] 2).数组指针与指针数组

爱上小公举 1203

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C语言 对于数组名和指针的理解

在C语言中,数组名保存的是数组的地址,也就是数组的第一个元素的地址,其值是一个常量。虽然保存的是一个地址,但是数组名不是指针,指针是用来保存地址的一个变量,其保存的地址可以改变,你可以对指针进行++,–,+=,-=,赋值等操作,但是不能对数组名进行这些操作。 在下面这个程序中,将数组的地址打印输出: #include "stdio.h" int main() { int a[] = {1,4,...

x故里草木深的博客 692

理解C语言数组传参与数组名的本质

本文深入解析C语言数组名本质及传参机制。数组名在多数情况下等价于首元素地址(arr+1跳过1个元素),但在sizeof运算时表示整个数组(特例)。数组传参本质是传递首元素地址,因此函数内修改会影响原数组。实验证明:arr_inc1(int arr[5])和arr_inc2(int *p)两种写法等效,都通过指针操作修改数组元素。而变量传参是值传递,需用指针才能修改原值。关键结论:数组名是地址常量(除sizeof外),数组传参实为地址传递,这是与变量传参的本质区别。

2401_87583721的博客 785

c语言——数组名该如何理解呢?

p和*先结合,表示p是指针,然后再结合[5]和int 表示是int[5]类型的。可以看出,&arr 取的是整个数组的地址,怎么存放这么多地址呢?sizeof(数组名+i) 就不能表示整个数组。表示整个数组,取的是整个数组的地址。sizeof是计算()占了多少字节(byte)表示整个数组 ※。

weixin_65994469的博客 700

【C语言】指针专题(数组名,取地址数组名)——带你深入理解指针 绝对干货,没一点儿水分!

好啦,今天的话题就讲到这里喽!大家是否有收获呢?我相信,认真看过这篇文章的你们一定是收获满满!上天一定会眷顾那些努力提升自己的人,所以大家每天都要坚持敲代码丫,我就在每天坚持敲代码呦!看谁卷得过谁,哈哈哈\(0^◇^0)/

c565114的博客 1738

C语言中用数组名作为参数能改变实参数组的值的理解

很多初学者不理解为什么C语言中用数组名作为参数能改变实参数组的值,现在来谈谈我的理解: 把实参数组传递给函数,则形参从数组哪里得到了其实地址,因此数组与实参数组共占了同一段内存单元,在函数调用期间,该变了形参数组的值,也就改变了实参数组的值。 现在问题来了,怎么理解共占同一段内存单元和值改变造成的影响 呢? 举例:         int     i = 12;

wpeclipse的专栏 9807

【C语言】深入理解数组名

在计算机编程的世界里,数组名是一个引人深思的概念。它既是数据存储的标签,又是指向序列元素的起点。深入理解数组名的本质,将揭示出在内存中如何管理数据的微妙之处,为程序员提供了更加精准的控制和优化代码的机会。本文将探索数组名的奥秘,解析其在编程语境中的多重作用。提示:以下是本篇文章正文内容,下面案例可供参考数组名通常表示数组的首元素地址,因此可以通过数组名访问数组的各个元素。然而,在某些特殊情下,数组名的行为可能有所不同,不总是指向首元素地址,需要根据上下文进行具体理解。

m0_68002296的博客 847

c语言中数组名和数组名取地址理解

1、数组名是个指针型常量,也就是值不能被改变。(指针常量和常量指针区别见本文) char *str = "hello"; char ch[6] = "hello"; ch = str;//错误,常量不能被赋值,正如 1=2,字面值常量1被赋值为2一样错误。 char ch[2]; 定义后,数组名相当于char * const ch = 0x...; ch就是某个常量的替代符了。 数组...

modi000的博客 3508

C语言中数组名的理解和注意事项!!!

在一维数组中数组名确实能表示首元素地址,但是有两个例外。1.sizeof(数组名),这里的数组名表示的是整个数组,计算的是整个数组的大小,单位是字节。2.&数组名,这里的数组名表示整个数,取地址的是整个数组的地址。以下代码可以自己动手写一下,易于加深理解。注意:在构造函数中形参为数组名时,在该函数中使用sizeof(数组名)计算的是数组首元素地址的大小,而不是整个数组的大小,因为数组在传参的时候,传递的是地址。

Bluexiaoboy的博客 255

C语言——如何深刻理解C语言数组名、sizeof、strlen

由于指针的访问可以通过*和[]实现,以及在不同条件下数组名代表的意义不同,加上对于sizeof、strlen的用法理解不够透彻,初学者在使用的时候容易错误使用指针,并且难以发现错误。本文将结合大量例子,讲解数组名、指针加减整数后指向位置、sizeof和strlen的用法。 ...

m0_56611833的博客 455

C语言中的 &和 *,以及数组名的本质,你理解吗?

根据大学中传授的知识,&叫做取地址,*叫做取内容。但是这种说法并不准确,也并不全面。 正确说法是:&叫作引用(reference),*叫作解引用(dereference),两者互为逆运算。 先举几个例子: //大学中学到的取地址和取内容 int a = 10; int * pa = &a;//此*仅仅是用于定义/声明指针变量用;&可理解为取地址 pri...

Eason_Grace的博客 4394
上一篇: C语言——指针的使用和传址调用
下一篇: C语言——二级指针
Jett_Lin
博客等级 码龄5年 305粉丝 36原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值