【c语言】 sizeof、strlen计算字符大小长度题目总结概括(详解)

日期: 2024-10-25 08:01:23|浏览: 9|编号: 104985

友情提醒:信息内容由网友发布,请自鉴内容实用性。

【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的严谨性! ! !

提醒:请联系我时一定说明是从浚耀商务生活网上看到的!