1.26——C语言数组、函数

从零开始刷SWUSTOJ:C语言编程题保姆级教程(含26-278题解析) 本文提供从零开始刷SWUSTOJ的C语言编程题保姆级教程,涵盖26-278题解析,适合初学者系统训练编程思维。教程从基础语法到算法优化,详细讲解变量命名、流程控制、循环与数组实战等内容,帮助读者掌握C语言编程技巧,应对期末考试题库挑战。 阅读详情

一、数组

1.数组越界下标可能导致哪些后果?


程序仍能正常运行
程序会异常终止或崩溃
程序能正常运行,但无法得到正确的结果

其他情况

2.传递数组有哪些方式?

 将数组作为参数传递给函数和将指向数组中第一个元素的指针传递给函数是完全等价的。将数组作为参数传递给函数时可以采用值传递和地址传递两种方式,前者需要完整地复制初始数组,但比较安全;后者的速度要快得多。

数组和指针之间的这种联系会引起一些混乱,例如,以下两种定义是完全相同的。

void func(chare [max])
{
 /**********/
}
void func(char *a)
{
 /**********/
}

3.数组和指针的关系
指针: 一个地址
数组: 连续存储的 n 个相同类型的元素

在绝大多数情况下,当一个数组类型的变量被使用的时候,会被自动的转换为一个指向数组第一元素的指针。
少数数组变量不会转换的情况包括数组变量出现在 sizeof 运算符后时,等。

数组不能作为函数的参数传递。函数参数位置的数组形式的参数声明,实际上是声明了一个指针。在函数参数位置上,数组形式的声明与指针声明是等价的。

4.数组的下标总是从0开始吗?

是的,在C语言中,对数组a[max](max是一个编译时可知的值)来说,它的第一个和最后一个元素分别是a[0]和a[max-1]。在其他一些语言中,情况可能有所不同,例如,在BASIC语言中数组a[max]的元素是a[1]到a[max]。注意,a[max]是一个有效的地址,但该地址中的值并不是数组a的元素。a[max]是数组后面第一个元素的值,可以使用,但不能查看该地址中的值。

5.数组作为参数传递给函数时,可以通过sizeof得到数组的大小吗?

不可以,当把数组作为函数的参数时,无法在程序运行时通过数组本身来告诉函数改数组的大小,因此函数的数组参数相当于指向该数组第一个元素的指针。这意味着把数组传递给函数的效率非常高,也意味着程序员必须通过某种机制告诉数组参数的大小。

为了告诉函数数组参数的大小,人们通常采用一下两种方法。

第一种方法是将数组和表示数组大小的值一起传递给函数,例如,memcpy()函数。

第二种方法是引入某种规则来结束一个数组,例如,在c语言中字符串再试以‘\0’结束的,而一个指针数组总是以空指针结束的。

6.指针或带下标的数组名都可以访问元素,哪一种更好呢?

与使用下标相比,使用指针能使C编译程序更轻易地产生优质的代码。假设你的程序中有这样一段代码:

/*X  la some type*/
X a[max];
X *p;
X x;
int i;

为了遍历数组a中的所有元素,你可以采用这样的一种循环方式(方式a):

//方式a
for(i = 0; i < max; ++i)
{
x = a[i];
/*------*/
}

你也可以采用另一种循环方式(方式b):

//方式b
for(p = a; p < &a[max]; ++p)
{
x = *p;
/*------*/
}

这两种方式中的初始情况和递增运算是相同的,作为循环条件的比较表达式也是相同的,区别在于“x=a[]”和"x=*p",前者要确定a[i]的地址,因此需要将i和类型x的大小相乘后再与数组a中第一个元素的地址相加;后者只需要简介引用指针p。简介引用快,而乘法运算却比较慢。

7.可以把另一个地址赋给一个数组命名吗?

不可以,数组名不能被放在赋值运算符的左边(它不是一个左值,更不是一个可以被修改的左值)。一个数组是一个对象,而它的数组名就是指向这个对象的第一个元素的指针。

加入一个数组是用extern或static说明的,则它的数组名是在链接时克制的一个常量,你不能修改这样一个数组名的值,就像你不能修改7的值一样。

8.字符串和数组有什么不同?

数组的元素可以任意一种类型,而字符串是一种特别的数组,它使用了一种众所周知的、确定长度的规则。

根据处理字符串的不同,语言可以分为两种,一种是简单地将字符串看作一个字符数组,另一种是将字符串看作一种特别的呃类型。C语言属于前一种,但有一点补充,即C字符是以一个NUL字符结束的。数组的值和数组中第一个元素的地址(或指向该元素的指针)是相同的,因此通常一个C语言字符串和一个字符指针是等价的。

一个数组的长度可以任意的,当数组名用做函数的参数时,函数无法通过数组名本身知道数组的大小,因此必须引入某种规则。对字符串来说,这种规则就是自负车的最后一个字符是ASCII字符“NUL(‘\0’)”。

9.array_name 和 &array_name 有什么不同?

前者是指向数组中第一个元素的指针,后者是指向整个数组的指针。数组是一种类型,它有三个要素,即基本类型、大小、数组的值。你可以用一个指针指向整个数组的值。

char a[max]
char *p;
/*pa is declared below*/
pa = &al
p = a;  /*=&a[0]*/

在运行上述代码后,发现p和pa的打印结果是一个相同的值,即p和pa指向同一个地址。但是,p和pa指向的对象是不同的。

10.为什么用const说明的常量不能用来定义一个数组的初始大小

并不是所有的常量都可以用来定义一个数组的初始大小,在C程序中,只有C语言的常量表达式才能用的定义一个数组的初始大小。然而,在C++中,情况有所不同。一个常量表达式的值在程序运行期间是不变的,并且是编译程序能计算出来的值。在定义数组的大小时,你必须使用常量表达式,例如,可以使用数字、预定义的常量标识符、一个sizeof表达式、一个有常量表达式组成的表达式或者使用枚举常量。

二、函数

1.C语言中main函数与其他的函数有什么不同?

C源程序是由函数组成的,函数是C源程序的基本模块,通过对函数的调用可以实现特定的功能。由于采用了函数模块式的结构,C语言易于实现结构化程序设计,使得程序的层次结构更加清晰,便于程序的编写、阅读、调试。

main函数是主函数,它可以调用其他函数,而不允许被其他函数调用,因此C程序的执行总是从main函数开始的,完成对其他函数的调用后再返回到main函数,最后有main函数结束整个程序。一个C源程序必须有、也只能有一个主函数main。

2.函数的定义与声明有什么区别?

 声明和定义是完全同的概念,声明是告诉编译器“这个函数或者变量可以在哪找到,它的模样像什么”。而定义则是告诉编译器,“在这里建立变量或函数”,并且为它们分配内存空间。

函数声明与定义:
  函数的声明如:int Add(int, int);函数声明就是给函数取名并指定函数的参数类型,返回值类型。值得注意的是,在C语言中,有一点跟C++不同,对于带空参数表的函数如:int func();在C中代表可以带任意参数(任意类型,任意数量),而在C++中代表不带任何参数。
  函数的定义如:int Add(int a, int b){} 函数定义看起来跟函数声明很像,但是它有函数体,如果函数体中使用了参数,就必须为参数命名,这里大括号代替了分号的作用。

3.如何定义一个函数?

一个普通函数的定义形式:

返回类型 函数名(参数列表)

{

     函数体;

 }

如:
(1)带返回值的定义

int sum1(int m)
{
	int i,sum=0; 
	for(i=1;i<=m;i++)     
		sum=sum+i;      
	return sum;
}

(2)不带返回值的定义

void sum2(int m)
{
	int i,sum=0; 
	for(i=1;i<=m;i++)     
		sum=sum+i;      
}

4.形参与实参的关系

形式参数和实际参数 
函数的参数分为形参和实参两种。在本小节中,进一步介绍形参、实参的特点和两者的关系。形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。形参和实参的功能是作数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。 
函数的形参和实参具有以下特点: 
1. 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。 
2. 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。 
3. 实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。 
4. 函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。

5.传值与传址有什么不同?
在C语言中常会遇到传值和传址问题,特别是在对栈操作的时候常会遇到类似InitStack(Stack &S)、DestroyStack(Stack &S)之类函数的情况,为什么这些函数在传参的时候会使用Stack &S的方式而不是使用Stack S的方式呢?主要原因是一个是传值不会改变原栈里面的值,一个是传址可以改变原栈里的值,我们在使用堆栈进行运算的时候,常用新建栈、删除栈、插入栈这些都需要对栈进行修改,需要用Stack &S,而像查询遍历之类的不需要改变栈里面的东西,则可以使用Stack S,但是使用Stack &S也不会出错。

6.指针变量或数组名作为函数参数的注意问题

指针变量作实参在调用是仍然符合”值传递“的规则,将其“值”赋给形参,相当于复制。此时数据在实参与形参传递仍是单向的,调用函数不会影响实参的“值”(即指针变量中所存的地址)。而与简单变量不同的是,指针变量复制给形参的“值”本身是一个地址,这个地址的形参访问其所致变量创造了可靠条件。

7.数组名作为函数参数注意问题

数组名本身是一个特殊的指针变量,其值是数组的首地址,因此作为实参时其传给形参的是内存中某指定单元的地址,调用过程中形参数组与实参数组占用同一个内存单元,因此对形参数组的操作也就是对实参数组的操作,对实参数组与形参数组来说数据传递表现为“双向”的,而对实参变量与形参变量而言数据的传递仍然是单向的。

8.结构体数组作函数参数的两种情况

用结构体数组作函数参数包含两类情况:结构体数组元素作为实参和结构体数组名作为实参。两类情况仍然服从数据的单向值传递原则,只不过前者传给形参的是某些变量的值,而后者传给形参的是结构体数组的首地址。

1.结构体数组元素作为实参:符合结构体变量作为实参规则,采取单向“值传递”方式将结构体变量所占的内存单元的内容全部顺序复制给形参(函数调用期间形参也要占用内存单元)。

2.结构体数组名作为实参:通整形数组数组名作为实参一样,传递给形参的是内存中指定单元的地址,调用过程中形参数组与实参数组占用同一段内存单元,因此对形参数组的操作也就是对实参数组的操作,对数组的操作表现为双向性。

9.如何编写有多个返回值的C语言函数

1.利用全局变量:全局变量的作用域是从定义变量开始到程序结束,把多个返回值定义成全局变量,当函数被调用时,全局变量被更改,再把更改后的全局变量应用于主调函数中。被更改后的全局变量值即为函数的多个返回值。

2.传递数组指针:把多个返回值作为数组元素定义成一个数组,并使改数组的地址作为函数的形式参数,以传址的方式传递数组参数。函数被调用后,形参数组改变导致实参改变,再从改变后的实参数组元素中获得函数的多个返回值。

3.传递结构体指针:把要求返回的数个值定义成一个结构体,然后同样以传递结构体指针方式把结构体的指针传递给形参结构体指针,那么函数中对形参的结构体的修改也是对实参结构体的修改,函数调用后获取的实参结构体成员即函数的多个返回值。

 

10.什么是回调函数

对指针的应用是C语言编程的精髓所在,而回调函数就是C语言里面对函数指针的高级应用。简而言之,回调函数是一个通过函数指针调用的函数。如果你把函数指针(函数入口地址)传递给另一个函数,当这个函数指针被调用它所指向的函数时,我们就说这个函数是回调函数。

c语言字节数组怎么定义,《C语言》—— 数组详解 数组的基本概念我们把一组数据的集合称为 数组(Array) ,它所包含的每一个数据叫做 数组元素 (Element),所包含的数据的个数称为 数组长度 (Length),数组中的每个元素都有一个序号,这个序号从0开始,而不是从我们熟悉的1开始,称为 下标 (Index),所包含数组的里面元素的类型叫做 数组类型 (Type)。一句话就说清楚了数组的基本概念,就是这么简单,_。数组底层结构探析1in... 阅读详情

相关推荐

零基础用AHK操作Excel:从数据读取到自动填写(附完整脚本解析)

本文为零基础用户详细介绍了如何使用AutoHotkey(AHK)通过COM接口高效操作Excel,实现从数据自动读取到填写的完整自动化流程。文章包含完整的脚本解析、环境搭建指南、核心代码逐行讲解以及实际应用案例,帮助办公人员大幅提升数据处理效率,告别重复劳动。

weixin_29202213的博客 556

SDUT PTA C语言实验:字符串处理实战技巧1~15

本文系统解析了SDUT PTA平台C语言字符串处理实验(1~15题)的核心技巧与实战方法。内容涵盖字符与字符串基础、变换清洗、统计查找、比较排序等核心操作,并提供了数组越界、结束符处理等关键避坑指南,旨在帮助学习者通过PTA实验巩固C语言字符串编程基本功,提升解决实际问题的能力。

weixin_29009501的博客 253

EtherCAT-1 技术概述

1.EtherCAT简介①开放的技术EtherCAT全称EtherNet Control Automation Technology,是由德国倍福(Beckhoff)公司提出的一种实时以太网技术。EtherCAT是一种开放但不开源的技术,意味着您可以任意使用这项技术,但若要进行相关设备的开发,则需要向倍福公司获取相关授权。②快速性相比传统现场总线,EtherCAT的数据传输速率有了极大的提升,可选10Mbit/s或100Mbit/s,甚至依托补充

tianya_xuan的博客 3544

函数原型

1 #include<stdio.h> void sum(int begin,int end) { int i; int sum=0; for(i=begin;i<=end;i++){ sum+=i; } printf("%d到%d的和是%d\n",begin,end,sum); } int main() { int a,b; scanf("%d%d",&a,&b); sum(a,b); return 0; } 2 #include<std

weixin_51625231的博客 856

动力锂电池-二阶RC模型等效电路-RLS参数辨识-Simulink

1.锂电池二阶RC等效电路模型

QQ1978009424的博客 1万+

libopus 实现pcm 编码到opus

opus 是一种音频格式,常用于语音通话、视频会议中。最近做了个pcm 到opus 的编码,踩了不少坑,特此记录一下。

sinat_27720649的博客 9476

C语言入门(3)——数组与函数

这一节主要关于数组和函数的相关知识。语法形式:• ret_type 是函数返回类型⽤来表⽰函数计算结果的类型,有时候返回类型可以是 void ,表⽰什么都不返回• fun_name 是函数名为了⽅便使⽤函数;就像⼈的名字⼀样,有了名字⽅便称呼,函数有了名字⽅便调⽤,所以函数名尽量要根据函数的功能起的有意义。• 括号中放的是形式参数函数的参数就相当于,⼯⼚中送进去的原材料,函数的参数也可以是 void ,明确表⽰函数没有参 数。如果有参数,要交代清楚参数的类型和名字,以及参数个数。• {}括起来的是函数体。

2301_80065652的博客 2634

把浮点数这件小事讲清楚:ABAP 7.51 里 Open SQL 与 ABAP CDS 的 FLTP 新玩法与避坑指南

ABAP浮点数计算的风险与应对 摘要:ABAP项目中的浮点数(FLTP)在跨平台计算时存在误差风险,同一逻辑在不同数据库平台可能产生细微差异。ABAP 7.51新增了两项关键能力:1)Open SQL和ABAP CDS中可为AVG函数指定结果类型,避免默认返回FLTP;2)ABAP CDS提供FLTP_TO_DEC转换函数。但需注意这些转换仍可能存在平台相关差异,且FLTP_TO_DEC会截断而非四舍五入小数位。开发者在涉及金额、数量等关键业务计算时,应明确数值语义并设计容错机制。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 214

C语言基础-数组篇

数组篇 一、为什么需要数组: 只要大量数据不关心数组名的时侯 二、数组的基本使用: 1.定义数组: int array[100]; //定义一个能放置100个数据的数组,没有赋值 int array[3]={1,2,3}; //有初始化的数组,完整初始化,该数组申请了三个整型内存空间,并赋值1,2,3; int array[100]={1,2,3}; //有初始化的数组,不完整初始化,该数组申请了100个整型内存空间,但是只是赋值了3个数放在了前三个位置。 2.给数组赋值: for(int i =1;

weixin_44278698的博客 3724

储能电池管理系统介绍(一)

介绍储能BMS的架构以及各模块功能

manjixingkong1234的专栏 1916

Windows版,vcenter 6.0 STS 证书更新--Vcenter 6.0 windows 版,没有-set_signing_cert 替换参数

Windows版,vcenter 6.0 STS 证书手动更新

技术是手段,服务才是目的。开源与协作是创新的活水,而核心技术的自主可控是立足之本。身处黄金时代,唯持续学习,方能不惧变化。从使用者到创造者,中国技术的未来,正待你们接过火炬,走得更远、更稳、更好。 678

C语言函数——数组讲解

C语言函数新篇章,数组讲解,再次踏上新的征程。

dongxue727504的博客 3694

【AI理论学习】深入理解扩散模型:Diffusion Models(DDPM)(理论篇)

继OpenAI在2021提出的文本转图像模型之后,越来越多的大公司卷入这个方向,例如谷歌相继推出了和。一些主流的文本转图像模型,例如,和采用了扩散模型()作为图像生成模型,这也引发了对扩散模型的研究热潮。与GAN相比,扩散模型训练更稳定,而且能够生成更多样的样本,OpenAI的论文也证明了

小哲的博客 5213

深入浅出C语言——数组

另外,C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,所以程序员写代码时,最好自己做越界的检查。数组在创建的时候如果想不指定数组的确定的大小就需要进行初始化,此时数组的元素个数根据初始化的内容来确定。二维数组的不完全初始化时,未初始化的元素默认为0。下标从0开始,arr[i]是访问数组的一个元素,i是用来指定数组的下标,使用变量是没有问题的。数组的下标是有范围限制的,如果数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。

weixin_55051736的博客 5778

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

buuctf逆向第26题[MRCTF2020]Transform1

写成这样报错了 发现flag【】要改成flag【0】 并且第13行不能用append 去查了下应该用join。得到flag值为MRCTF{Tr4nsp0sltiON_Clph3r_1s_3z}跟进dword回到原文并分别提取dword和byte字符数组。把0去掉 且只取33位 并根据for循环中的异或编写脚本。左侧找到main函数并跟进,按tab转换为c语言伪代码。由10到212行的if可知字符串长度为33。查了下LOBYTE不影响做题。

Knozya的博客 421

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

387. First Unique Character in a String(C语言)

看有没有重复的字母出现,没有的话输出第一个没重复的字母的下标,都是重复的话就输出-1 Given a string, find the first non-repeating character in it and return it's index. If it doesn't exist, return -1. Examples: s = "leetcode" return

1046

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C语言——动态数组的创建和使用

动态数组是相对于静态数组而言的,从“动”字可以看出它的灵活性。静态数组的长度是预先定义好的,在整个程序中,一旦给定数组大小后就无法改变。而动态数组则不然,它可以根据程序需要重新指定数组大小。动态数组的内存空间是由堆动态分配的,通过执行代码为其分配存储空间,只有程序执行到分配语句时,才为其分配存储空间。

专注于C语言编程干货分享 3万+

C语言读取文件内容,保存到数组里面

前言 本文分为两部分,其中一部分主要使用C语言编程实现读取文件内容(要打开的文件名称采用命令行方式输入),统计文件内容的行数,并将文件内容保存到数组里面打印输出。 另一部分使用C语言编程实现读取文件内容(要打开的文件名称采用命令行方式输入),统计文件内容的行数,保存文件内容的数组采用动态分配内存的方式,这样不管文件大小,都可以进行文件内容读取保存。同时还可将读取的文件内容使用fprintf函数保存...

qq_44420246的博客 5万+

C语言 写一个函数,将一维数组中的元素逆序存放

// // main.c // c_test2 // // Created by vincent_guo on 13-3-26. // Copyright (c) 2013年 vincent_guo. All rights reserved. // #include #include //写一个函数,将一维数组中的元素逆序存放(用指针做这题) //逆序存放第一种写法 void re

wfung_kwok的专栏 4万+

C语言数组

文章目录一、数组二、占用内存的大小三、数组的初始化四、注意事项五、在for循环中数组六、二维数组七、多维数组八、字符串1、字符串的概念2、字符串的初始化3、字符串的赋值4、关于字符串结束符0的讨论5、字符串数组十、课后作业十一、版权声明 先来看一个需求,超女选秀一共有5人参加,输入每位超女的体重并保存在变量中,最后计算出超女的的平均体重。 示例(book40.c) /* * 程序名:book4...

C语言实战技术 2034

[重点]C语言——数组

为什么需要数组,本篇详细记录了数组的定义和内存布局,访问数组元素,3种初始化数组的方式,字符数组与字符串,数组使用注意事项和细节!!!

m0_53415522的博客 3353

c语言26个字母指针数组排序,C语言:通过指针对数组元素进行排序

//// main.c// Pointer_array//// Created by ma c on 15/8/2.// Copyright (c) 2015年 bjsxt. All rights reserved.// 要求:使用指针的指针输出字符串。首先要使用指针数组创建一个字符串数组,然后定义指向指针的指针,使其指向字符串数组,并使用其输出数组中的字符串。同时对数组中的内容进行升序...

weixin_31569671的博客 1571

C语言学习——数组详解

C语言学习——数组 在 C 语言中,除了整型、实型和字符型等基本数据类型之外,还可以将基本数据类型按照一定的规则组合起来构成较为复杂的数据类型,称为构造数据类型,又称导出数据类型,主要包括数组、结构体、共用体等。数组中顺序存放了一批相同数据类型的数据,这些数据不仅数据类型相同,而且在计算机内存里连续存放,地址编号最低的存储单元存放数组的起始元素,地址编号最高的存储单元存放数组的最后一个元素。通过数...

Chris683的博客 8463

《C语言》—— 简单的数组问题,一定不再你的话下

本文详细讲述了数组的概念、数组的特性、数组的常见问题、数组底层结构剖析、数组常见面试题。有需要了解的快戳进来把。

龙跃十二 2491
上一篇: 1.24——数据结构,运算符与表达式
下一篇: 1.28——指针
Superain丶
博客等级 码龄11年 9粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值