玩转指针(5)

一、sizeof和strlen的对比

①.sizeof

==a.sizeof是操作符,不是函数。==它计算的是某种类型所占空间的大小,单位是字节。sizeof的返回类型是无符号整型,最好用%zd打印它的返回值。
b.sizeof只关心某种类型所占内存空间的大小,不关心内存里面放的是什么。

②.strlen

a. strlen的原型
 size_t strlen ( const char * str );
字符指针str接收的是字符串或者字符数组中首字符的地址。strlen会从首字符的地址开始,向后逐个字节的访问,直到访问到’\0’就停下来。最后返回’\0’之前的字符个数
b.strlen是库函数,使用前要包含头文件string.h。它计算的是字符串或字符数组中’\0’之前的字符个数。strlen 函数关注内存中的’\0’,会⼀直向后找 \0 字符,直到找到为⽌,所以可能存在越界查找。
#include<stdio.h>
#include <string.h>
int main()
{
	char arr1[3] = { 'a', 'b', 'c' };
	char arr2[] = "abc";//arr2中存放的是字符a,b,c以及'\0'
	printf("%zd\n", strlen(arr1));//随机值
	//strlen是接收的是字符数组arr1中首字符a的地址,strlen会从'a'开始,向后逐个字节的找'\0',直到找到为止。
	printf("%zd\n", strlen(arr2));//3
	
	printf("%zd\n", sizeof(arr1));//3
	printf("%zd\n", sizeof(arr2));//4
	return 0;
}

③关于sizeof与strlen的两道笔试题

第一道
#include<stdio.h>
int main()
{
	int a[] = { 1,2,3,4 };
	printf("%zd\n", sizeof(a));//16个字节 
	//sizeof中单独放数组名(这里的数组名表示整个数组),求的是整个数组所占内存空间的大小

	printf("%zd\n", sizeof(a + 0));//在32位环境下是4个字节,在64位环境下是8个字节 
	//这里的sizeof中放的是a+0,并不是单独放数组名,所以这里的a表示首元素的地址,a+0也是首元素地址

	printf("%zd\n", sizeof(*a));//4个字节 
	//a是首元素的地址,*a表示首元素(a[0])

	printf("%zd\n", sizeof(a + 1));//在32位环境下是4个字节 ,在64位环境下是8个字节 
	//a是首元素的地址,a+1是第二个元素的地址

	printf("%zd\n", sizeof(a[1]));//4

	printf("%zd\n", sizeof(&a));//在32位环境下是4个字节,在64位环境下是8个字节 
	//&a表示取出整个数组的地址,整个数组的地址也是地址,既然是地址就占4或者8个字节
	printf("%zd\n", sizeof(*&a));//16个字节
	/*
	两种理解:
	第一种:*与&抵消了,因此*&a=a,sizeof(*&a)=sizeof(a)
	第二种:&a表示取出整个数组的地址,*&a表示整个数组
	*/


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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值