首页 > 其他分享 >【C语言】sizeof 和 strlen

【C语言】sizeof 和 strlen

时间:2024-08-15 09:23:58浏览次数:7  
标签:int C语言 数组名 数组 printf sizeof strlen

sizeof和strlen的对比

sizeof

在学习操作符的时候,我们学习了 sizeof , sizeof 计算变量所占内存内存空间大小的,单位是字节。
如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。
sizeof 只关注占用内存空间的大小,不在乎内存中存放什么数据。
比如:

#include <stdio.h>
int main()
{
 int a = 10;
 printf("%d\n", sizeof(a));
 printf("%d\n", sizeof a);
 printf("%d\n", sizeof(int));
 
 return 0;
}

在这里插入图片描述

strlen

strlen 是C语言库函数,功能是求字符串长度。函数原型如下:

size_t strlen ( const char * str );

统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。
strlen 函数会一直向后找 \0 字符,直到找到为止,所以可能存在越界查找。

#include <stdio.h>
int main()
{
 char arr1[3] = {'a', 'b', 'c'};
 char arr2[] = "abc";
 printf("%d\n", strlen(arr1));
 printf("%d\n", strlen(arr2));
 
 printf("%d\n", sizeof(arr1));
 printf("%d\n", sizeof(arr1));
 return 0;
}

sizeof 和 strlen的对比

sizeof
1. sizeof是操作符
2. sizeof计算操作数所占内存的⼤⼩,单位是字节
3. 不关注内存中存放什么数据
strlen
1. strlen是库函数,使⽤需要包含头⽂件 string.h
2. srtlen是求字符串⻓度的,统计的是 \0 之前字符的隔个数
3. 关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界

数组和指针笔试题解析

一维数组

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

printf("%d\n",sizeof(a));  //16
//sizeof(数组名)的情况,计算的是整个数组大小

printf("%d\n",sizeof(a+0));  // 4/8
//a表示的就是数组首元素地址,a+0还是首元素

printf("%d\n",sizeof(* &a));   //16
//1.&与 * 抵消
//2.&a的类型为数组指针,int(*)[4],*&a就是对数组指针解引用后访问一个数组大小

字符数组

char arr[]="a,b,c,d,e,f"

printf("%zd\n",strlen(*arr));
//传递的是'a'-97 //arr

printf("%zd\n",strlen(%arr));    //6
//arr虽然是数组地址,但是也指向数组起始位置

printf("%zd\n",strlen(&arr+1));
//随机值

二维数组

int a[3][4] = {0};
printf("%d\n",sizeof(a));
//12*4=48个字节,数组名也被单独放在sizeof

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

printf("%d\n",sizeof(a+1));
//这里的a是数组首元素地址吗,应该是第一行的地址,则a+1是第二行的地址

printf("%d\n",sizeof(*a));
//*a--> *(a+0)--> a[0]

printf("%d\n",sizeof(a[3]))
//这里不存在越界
//因为sizeof内部表达式不会真实计算,只会根据其类型计算大小,并不会真实计算

总结

数组名的意义:

  1. sizeof(数组名),这里的数组名表⽰整个数组,计算的是整个数组的大小。
  2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
  3. 除此之外所有的数组名都表示首元素的地址

标签:int,C语言,数组名,数组,printf,sizeof,strlen
From: https://blog.csdn.net/Sakura_ding/article/details/141205851

相关文章

  • C语言发展史
    在线书籍:54笨鸟1.C语言发展史任何一种新事物的出现都不是来自于偶然,而是时代所驱使的必然结果。1.1C语言有多伟大如果你问我:C语言有多伟大。那么,我可能会想一下,说:多伟大我不知道,但是我知道很伟大。这里,我想说一句可能有点片面的话,就是:如今这世界上,凡是带电的地方,可能......
  • 初学者如何学c语言
    你对学习如何编程感兴趣吗?如果是的话,你从C语言编程开始是不会错的。C语言是一种通用的、强大的、广泛使用的编程语言,可用于构建操作系统、开发视频游戏,甚至创造机器人。然而,对于初学者来说,学习C语言编程可能是令人生畏的。这就是为什么我们把这个初学者指南放在一起,让你开......
  • C语言中水平制表符 \t 与退格键 \b 的使用方法探索
    经个人实践,C语言中使用转义序列码(\t)会输出一个8个格数的组合,当\t之前的内容达到8*n格时,后续内容出现在8*(n+1)+1格。(式中n>=1,且为整数)探索过程如下:第一次在看到某大佬的科普中提到:\b将输出位置左移一位\t表示一个tab的距离即1个大空格,相当于4个小空格......
  • C语言函数(上)
    前言与概述笔者打算通过两篇文章详细介绍C语言函数的相关知识,本文章将会介绍C语言函数定义、C语言函数分类、函数参数、函数调用。下一篇文章将会介绍函数声明、链式访问,并详细介绍函数递归。笔者不才,如有错误,欢迎各位编程大佬在评论区批评指正。C语言函数定义维基百科中将C......
  • 关于C语言学习的第二天
    今天学习的是C语言,本次接着上次的内容继续开始,主要是说C语言中数据类型的内容,如有疑问可以翻找我上一篇关于C语言的内容。首先是冯诺依曼机,它规定指令和数据都是存储在内存中的,都是以二进制形式存储的。那为什么是使用二进制呢?因为这在电器元件中易实现,且双稳态元件较多。而二......
  • C语言基础11指针
    指针的引入为函数修改实参提供支持。为动态内存管理提供支持。为动态数据结构提供支持。为内存访问提供另一种途径。指针概述内存地址:系统为了内存管理的方便,将内存划分为一个个的内存单元(1个内存单元占1个字节),并为每一个内存单元进行了编号,内存单元的编号称为该......
  • c语言中输入问题,scanf遇到空格就会停止输入
    一.问题描述:在c语言当中使用scanf进行输入字符串时,遇到空格会停止输入,如下面的例子。#include<stdio.h>intmain(){ chars[30]; scanf("%s",s); printf("%s",s); return0;}如下图可看出当输入“Helloworld!”时,从输出可以看出只能读入“Hello”。二.原因:在C......
  • c语言转换char字符数组为大写小写
    #include<string.h>#include<stdlib.h>#include<stdio.h>#include<time.h>#include<ctype.h>#include<sys/stat.h>voidgetdate(char*datestr,char*format){ time_tnnowtime=time(NULL); structtm*ptmTemp=loc......
  • c语言替换字符串 Replace the first ‘oldstr‘ with ‘newstr‘ in ‘srcstr‘
    #include<string.h>#include<stdlib.h>#include<stdio.h>#include<time.h>#include<ctype.h>#include<sys/stat.h>voidgetdate(char*datestr,char*format){ time_tnnowtime=time(NULL); structtm*ptmTemp=loc......
  • C语言实现排序之归并排序算法
    一、归并排序算法基本思想        归并排序采用分治法策略,将数组递归地分成两半,然后对每一半进行排序,最后将两个已排序的子数组合并成一个完整的有序数组。步骤递归划分:将数组分成两半,直到每个子数组只有一个元素。递归排序:递归地对每个子数组进行排序。合并子数组......