阅读提示:文章比较冗长,若为了快速做题,请用常规方法sizeof和方法六计数器即可,其他对完成作业都没什么特别的意义,最后感谢您的点击与阅读~
文章目录
数组与字符串
在C语言中,最精彩的地方果然还是属于数组与指针。所以写了一下在C/C++中,有关于求取数组与字符串长度的几种主流的方法。写得比较简略,若有疑问可以评论出来,若有不足欢迎指出,谢谢。
1 数组
静态数组:TYPE Array[NUM];
而动态数组:TYPE *Array = (TYPE *) malloc ( sizeof(TYPE) * NUM);
1.1 静态数组
对于任何数组而言,若长度已知,那么再写个求长度的函数是没有意义的,除非求有效长度,而非分配长度。比如,int array[N]
这种形式。
而且,由于静态数组通常在预编译的时候就知道了数组长度,所以通常没必要在程序运行时再计算一遍长度,如int array[]
。
当然,这种知道是机器知道,而不是人知道。如果人希望知道这个数组的长度大小,那么这时使用在程序预编译阶段求值的运算符、模板等东西就特别合适,尽管它们会有些缺陷。
(1)sizeof 运算符
sizeof运算符可以返回一个变量或者类型所占的内存字节数。那么使用sizeof,分别获取数组内存和单个元素内存,其值之比就是数组长度。
- sizeof - 常规方法
int array[] = {
1,2,3,4,5,6,7,8,9}
int elementCount = sizeof (array) / sizeof (array[0]);
以下这几种写法是等价的:
1、整个数组所占字节数:sizeof(array) = sizeof(int[9])
2、单个元素所占字节数:sizeof(int) = sizeof(array[0]) = sizeof(array[9]) = sizeof(*array)
3、数组长度 = 整个数组所占字节数 / 单个元素所占字节数
不过,我们在C语言中习惯上在使用时都把它定义成一个宏:
- sizeof - 宏定义表达式
/*方法一:在C语言中,sizeof的宏定义*/
#include<stdio.h>
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
int main(void)
{
int array[] = {
1,2,3};
printf("\nThe length of the array is %lu .\n", ARRAY_SIZE(array));
return 0;
}
- sizeof - 宏定义函数体
/*方法二:在C语言中,sizeof宏定义的另外一种写法*/
#include<stdio.h>
#define GET_ARRAY_LEN(arr, len) {len = (sizeof(arr) / sizeof(arr[0]));}
int main(void)
{
int length = 0;
int array[] = {
1,2,3};
GET_ARRAY_LEN(array, length);
printf("\nThe length of the array is %d .\n", length);
return 0;
}
- sizeof - Linux内核源码
由于上面的宏并不完整,缺少了传参的类型判断容易被误用,比如用在指针而不是数组上。那么,在Linux内核源码分析里,增加了一个判断是否为数组的操作。
//以下方法均可运行,欢迎尝试
/*方法一的延伸:在Kennel中,ARRAY_SIZE宏的标准写法,增加了变量类型判断*/
#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
/*除此之外,还有另一种标准写法*/
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) \
+ sizeof(typeof(int[1 - 2*!!__builtin_types_compatible_p(typeof(arr), typeof(&arr[0]))]))*0)
/*当然,如果上述方法太长,可以利用typeof来判断类型*/
#define ARRAY_