尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

c语言函数参数列表为数组情况

c语言函数参数列表为数组情况 最近我在看我同事写的处理cmd命令行的代码命令行的相关数据存在了一个uint8_t [xxx]类型的数组中而我需要处理的就是这个数组为了降低耦合性我习惯使用函数参数传参方式实现对数组的处理这样就能很好保证“全局变量”“函数调用”之间的线性流水线式操作了。现在就有一个问题了数组是一个复合型类型定义作为参数传递的时候除了首元素的地址作为参数1参与参数传递之外数组元素个数是否需要也作为参数2参与参数传递呢以前我认为数组元素个数作为参数2参与参数传递是没有疑问理所当然的因为如果只传递一个指针变量既不能完整代表数组这个概念也无法与真正指针变量进行区分也就是到底代表数组还是真表示一个指针变量如果没有数组元素个数这个参数的话是无法区分的。但是现在我处理cmd这个数组中的元素其中就包含数组元素部分提取并整合后写到另外一个数组中因为我需要的只是数组元素中的一部分至少帧头和帧尾是不需要的因此我才有这个疑问数组元素个数有必要在函数定义时作为参数2参与传参吗数组元素个数这个变量在函数内部可能只参与校验作用防止发生越界情况作用有限。我现在的答案定义数据数据提取含义的函数的时候数组元素个数也是有必要作为参数2参与数值传递的即使数组元素个数在函数中作用有限也需要定义。数组元素个数在函数定义时参与数据传递的作用有哪些1防止越界行为的发生。有了数组元素个数就可以使用for循环遍历每一个数组元素也可以防止发生越界行为。试想一下如果没有数组元素个数这个参数那么for循环就无从写起循环条件缺少一部分。2使定义的函数具有通用性有了数组个数作为参数参与传参元素类型相同数组元素个数不同的数组就都可以参与函数传参被同一个函数调用了。假设没有数组个数函数内部可能就需要直接调用全局变量的数值作为数组元素个数这样写的函数就是特定的非通用的。这里也提醒我们要想写的函数具有通用性将限制函数的因素写作为参数是必要的。3支持子数组和切片处理。也就是如果数组首元素地址元素个数作为函数参数在函数定义的时候参与定义当该函数调用的时候除了最常规的数组名整个数组元素个数参与之外还可以“数组名offset, 部分数组元素个数”这种方式参与函数调用也就是子数组参与函数调用了。4有了数组元素个数作为函数参数可以区分野指针还是空数组。空数组就是数组元素个数为0的情况野指针就是指针参数的值为NULL。如果没有数组元素个数这个参数是无法区分是空数组还是野指针的。特殊情况字符串。字符串也是自定义数据类型也是无法直接传递的。字符串的最后一个字符为\0数值为0x00因此我们经常看到操纵字符串的函数是没有字符长度的字符串有两种存储方式一种是以字符方式存在一个数组中一种是以字符常量方式存在只读数据区。因此操纵字符串的方式就是以参数“char *xxx”这也是允许的因为字符串的特点就是以‘\0’为结尾甚至存储在数组中有多个\0结尾因此第一个\0之前的有效字符个数也是确定的因此“字符串参数可以只有首字符的地址”。最后数组元素使用“array[index]”这种方式实现数组元素的读写直接访问这是数组特有的一种“基址变址解引用”的“语法糖”其实和通过指针方式访问是一样的这里所说的特有的意思是结构体变量访问内部成员是不能使用的结构体特有访问内部成员的方式有“直接间接”两种对应运算符为“. -”这2种运算符是数组不能使用的本质上也是“基址变址解引用”的“语法糖”。因此数组和结构体在很多概念上都有相似之处相对的数组访问方式更简单只有一种“直接访问”但是相对的结构体访问内部变量方式要复杂一些除了“直接访问”之外还有“间接访问”这种方式。c语言发明的时候是现发明的数组然后才发明的结构体因此结构体是数组的一种超集它继承了大量数组的概念又在此基础上增加了很多特有的特点随着结构体的发明“数组的结构体”、“结构体的数组”、“数组嵌套数组”、“结构体嵌套结构体”让c语言描述事物的能力得到进一步加强总之一句话“先有的数组后有的结构体结构体继承于数组结构体是数组的超集数组有的结构体一定有结构体是一种特殊的数组”。
返回列表