0
点赞
收藏
分享

微信扫一扫

【C语言】指针练习篇(上),深入理解指针---指针和数组练习题和sizeof,strlen的对比【图文讲解,详细解答】

精进的医生 2024-02-16 阅读 8

目录

一、sizeof和strlen的对比

 1.1sizeof操作符

 1.2strlen

1.3表格总结

1.4sizeof题目

二、指针,数组笔试题

2.1一维数组

2.2 字符数组


一、sizeof和strlen的对比

 1.1sizeof操作符

 sizeof 计算变量所占内存内存空间大小的,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。sizeof 只关注占用内存空间的大小,不在乎内存中存放什么数据,并且在计算变量的时候,括号可以省略。额外说明size_t就是为sizeof设计的。

就比如以下代码: 

#include<stdio.h>

int main()
{
	int a = 23;

	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof a);
	printf("%d\n", sizeof(int));

	return 0;
}

我们可以看到,结果都是4。 

 1.2strlen

strlen是C语言库函数,函数功能原型如下:

strlen字符串长度统计的是从形参str中这个地址开始向后,\0之前字符串中字符的个数。如果没有找到\0,那么strlen函数会在内存中⼀直向后找\0字符,直到找到\0为止,所以可能存在越界查找。

就比如下面这段代码: 

#include<stdio.h>
#include<string.h>

int main()
{
	char arr[] = "SILMY23";
	char arr1[] = { 'S','I','L','M','Y' };

	printf("%d\n", strlen(arr));
	printf("%d\n", strlen(arr1));

	return 0;
}

由于前面有\0,后面没有\0,那么第二个原本的长度应该是五,但存在越界查找,所以长度必然不为5.

结果如下:

1.3表格总结

sizeofstrlen
性质操作符是库函数,使用需要包括头文件#include<string.h>
功能计算操作数所占内存的大小,单位是字节求字符串长度
特点不关注内存中存放什么数据关注内存中是否有\0,如果没有\0 ,就会持续往后找,可能会越界查找

1.4sizeof题目

请思考以下代码,L和S的值: 

#include<stdio.h>

int main()
{
	short S = 4;
	int I = 2;
	int L = sizeof(S = I + 23);
	printf("%d \n", L);
	printf("%d \n", S);
	return 0;
}

结果如下: 

 在上述代码中,S=I+23其实是没有参与计算的,因为在sizeof中的操作数如果是一个表达式,表达式就不参与计算,所以最后的S还是4。其次,sizeof计算其实是按照操作类型来推理的,比如上述中S是short两个字节的短整型,所以L是两个字节。 

二、指针,数组笔试题

2.1一维数组

如果你不理解数组名可以跳转至http://t.csdnimg.cn/6zjW4,观看第二点

    int a[] = { 1,2,3,4 };

	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(a + 0));
	printf("%d\n", sizeof(*a));
	printf("%d\n", sizeof(a + 1));
	printf("%d\n", sizeof(a[1]));
	printf("%d\n", sizeof(&a));
	printf("%d\n", sizeof(*&a)); 
	printf("%d\n", sizeof(&a + 1));
	printf("%d\n", sizeof(&a[0]));
	printf("%d\n", sizeof(&a[0] + 1));

这是在32位环境和64位环境下的结果 

 

2.2 字符数组

 2.2.1

	char arr[] = {'S','I','L','M','Y'};

	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(arr + 0));
	printf("%d\n", sizeof(*arr));
	printf("%d\n", sizeof(arr[1]));
	printf("%d\n", sizeof(&arr));
	printf("%d\n", sizeof(&arr + 1));
	printf("%d\n", sizeof(&arr[0] + 1));

 结果如下:

2.2.2 

	char arr[] = { 'S','I','L','M','Y' };

	printf("%d\n", strlen(arr));
	printf("%d\n", strlen(arr + 0));
	printf("%d\n", strlen(*arr));
	printf("%d\n", strlen(arr[1]));
	printf("%d\n", strlen(&arr));
	printf("%d\n", strlen(&arr + 1));
	printf("%d\n", strlen(&arr[0] + 1));

32位结果如下:

64位结果如下:

2.2.3

	char arr[] = "SILMY23";

	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(arr + 0));
	printf("%d\n", sizeof(*arr));
	printf("%d\n", sizeof(arr[1]));
	printf("%d\n", sizeof(&arr));
	printf("%d\n", sizeof(&arr + 1));
	printf("%d\n", sizeof(&arr[0] + 1));

 结果如下:

2.2.4 

	char arr[] = "SILMY23";

	 printf("%d\n", strlen(arr));
	 printf("%d\n", strlen(arr + 0));
	 printf("%d\n", strlen(*arr));
	 printf("%d\n", strlen(arr[1]));
	 printf("%d\n", strlen(&arr));
	 printf("%d\n", strlen(&arr + 1));
	 printf("%d\n", strlen(&arr[0] + 1));

32位结果如下: 

 

64位结果如下:

 2.2.5

char* p = "SILMY23";

 printf("%d\n", sizeof(p));
 printf("%d\n", sizeof(p + 1));
 printf("%d\n", sizeof(*p));
 printf("%d\n", sizeof(p[0]));
 printf("%d\n", sizeof(&p));
 printf("%d\n", sizeof(&p + 1));
 printf("%d\n", sizeof(&p[0] + 1));

32位结果如下图:

64位结果如下图: 

  2.2.6

	char* p = "SILMY23";

	 printf("%d\n", strlen(p));
	 printf("%d\n", strlen(p + 1));
	 printf("%d\n", strlen(*p));
	 printf("%d\n", strlen(p[0]));
	 printf("%d\n", strlen(&p));
	 printf("%d\n", strlen(&p + 1));
	 printf("%d\n", strlen(&p[0] + 1));

32位结果如下:

64位结果如下: 

 

举报

相关推荐

0 条评论