【c语言】 sizeof、strlen计算字符大小长度题目总结概括(详解)
可以理解为一个运算符,其作用简单来说就是返回一个对象或者类型占用的内存字节数。
MSDN上的解释是:
给出 of ,以字节为单位,带有 a 或 a type(types)。这是一个类型的值。
其返回值类型在头文件.h中定义。这是一个依赖于构建系统的值,
一般定义;
它有两种语法形式:
一:();//(类型);
二: ; //目的;
示例:(在 64 位平台上)
一:
int 是一种类型,表示整数,所以
(int) - 正确答案是:4
int - 错误
二:
整数我;
(i)——正确答案是:4
i——正确答案是:4
(i可以作为整数,也可以作为运算对象)
那么当它后面跟着一个数字时会发生什么呢?
例子:
一:
5 - 5 会被计算机视为整数,相当于 (int) - 答案是:4
二:
3. ——3.会被视为双精度浮点类型,相当于()——答案是:8
接下来,讨论指针:
在32位系统中,指针变量的值通常是4
在 64 位系统上,指针变量的值通常为 8(以字节为单位)。
也就是说,无论你是int*、char*、float*、*等,只要你是一个指针,不管指针指向什么对象,得到的结果要么是4,要么是8,取决于是不是您使用的计算机是 32 位或 64 位操作系统。
以下是一道经典的笔试题:
解析:(单位为字节)
(arr)-----表示计算数组总体大小。 (字符串末尾还有一个'\0',所以答案是6+1=7)
(arr+0)------表示计算第一个元素的地址大小。 (只要是地址,要么是4,要么是8,取决于32位/64位)
(*arr) ------ 表示计算第一个元素的字节大小。 (字符'a',char类型,所以字节大小为1)
(arr[1]) ------表示计算第二个元素的字节大小(字符'b',因此字节大小为1)
(&arr)------表示计算arr数组地址的大小(&array name表示取出整个数组的地址)(地址)
(&arr+1)------表示跳过整个数组后计算地址大小(但也是地址)
(&arr[0]+1)------表示计算第二个元素的地址大小(但也是地址)
是一个函数,用于测量字符串的实际长度(不包括'\0')。
是的,缩写。另外,参数只能使用char*,且必须以''\0''结尾。
简单函数如下:
代码语言:
复制
char str[10] = "china";
printf("%d\n", strlen(str));
//结果如下:
5
D:\VS\Project4\x64\Debug\Project4.exe (进程 16032)已退出,代码为 0。
按任意键关闭此窗口. . .
下面是几个经典问题:
我们先来说说正确的:
(arr)----计算数组的总长度,arr代表数组第一个元素的地址(计算结果为6)
(arr+0)------与(arr)相同(计算结果为6)
(&arr[0]+1) ------ 表示跳过第一个元素,开始计算长度(计算结果为5)
至于为什么中间4个会报错呢?我们来仔细分析一下:
(*arr) -----arr数组名的解引用操作将得到字符'a'->ASCII码97(地址)。后面不会遇到字符'\0',但是会遇到'\0'。就会停止,所以这种写法是错误的。
(arr[1]) ----同样,(arr[1]) 也是错误的。
(&arr) ----&arr代表整个数组的地址,为什么不起作用呢?
提示:“const char *”类型的实参与“char *”类型的形参不兼容。如果函数参数是char *类型,直接写入字符串会报错。于是我就抱着试一试的心态来到了Linux平台,用gcc跑了一下。请查看结果:
代码语言:
复制
[bsk@localhost test1]$ gcc test.c
test.c: In function ‘main’:
test.c:6:1: warning: passing argument 1 of ‘strlen’ from incompatible pointer type [enabled by default]
printf("%d\n",strlen(&arr));
^
In file included from test.c:2:0:
/usr/include/string.h:395:15: note: expected ‘const char *’ but argument is of type ‘char (*)[7]’
extern size_t strlen (const char *__s)
^
[bsk@localhost test1]$ ls
a.out dir1 file.txt test.c
[bsk@localhost test1]$ ./a.out
6
[bsk@localhost test1]$ ^C
虽然它给了我警告,但它仍然运行。 (&arr+1) 怎么样?
代码语言:
复制
[bsk@localhost test1]$ vim test.c
[bsk@localhost test1]$ gcc test.c
test.c: In function ‘main’:
test.c:6:1: warning: passing argument 1 of ‘strlen’ from incompatible pointer type [enabled by default]
printf("%d\n",strlen(&arr+1));
^
In file included from test.c:2:0:
/usr/include/string.h:395:15: note: expected ‘const char *’ but argument is of type ‘char (*)[7]’
extern size_t strlen (const char *__s)
^
[bsk@localhost test1]$ ls
a.out dir1 file.txt test.c
[bsk@localhost test1]$ ./a.out
0
[bsk@localhost test1]$
也运行成功,但结果是一个随机值。由此可见vs的严谨性! ! !