自学内容网 自学内容网

玩转指针(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;


原文地址:https://blog.csdn.net/2402_84440417/article/details/142532870

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!