首页 > 其他分享 >C语言使用sizeof,strlen计算数组、指针大小长度汇总

C语言使用sizeof,strlen计算数组、指针大小长度汇总

时间:2024-08-24 12:26:02浏览次数:6  
标签:arr -- 元素 C语言 地址 数组 sizeof strlen

目录

一、字符串数组 

二、字符数组 

三、int型数组 

四、字符指针

五、二维数组


注意:数组名除了在sizeof()和&()表示数组地址,其他都表示首元素地址。

地址所占字节4(32位)/8(64位)。

一、字符串数组 

char arr[ ]={"abcdef"};
sizeof解析strlen
arr7包括\06
arr+04/8首元素地址+0仍表示首地址6
*arr1*对首地址解引用表示首元素error(对arr数组名解引用操作会得到字符‘a’->ASCII码97(地址)后面不会再遇到'\0',而strlen遇到'\0'才会停止,所以这种写法就是错误的。)
arr[1]1第一个元素error(同上)
&arr4/8数组地址6
&arr+14/8+1跳过整个数组后的地址随机
$arr[0]+14/8第二个元素的地址5

解析:

sizeof(arr)--——--表示计算数组整体的大小。(字符串末尾还有一个‘\0’所以答案为6+1=7)

sizeof(arr+0)--——--表示计算首元素地址大小。(只要是地址,不是4就是8,取决32位/64位)

sizeof(*arr)--——--表示计算首元素字节大小。(字符‘a’,char类型,所以字节大小是1)

sizeof(arr[1])--——--表示计算第二个元素字节大小(字符‘b’,所以字节大小是1)

sizeof(&arr)--——--表示计算arr数组地址的大小(&数组名 表示取出整个数组的地址)(地址)

sizeof(&arr+1)--——--表示计算跳过整个数组后的地址大小(但也是地址)

sizeof(&arr[0]+1)--——--表示计算第二个元素的地址大小(但也是地址)

strlen(arr)--——--计算数组整体长度,arr代表了数组首元素地址(计算结果是6)

strlen(arr+0)--——--和strlen(arr)一样(计算结果是6)

strlen(&arr[0]+1)--——--表示跳过第一个元素开始计算长度(计算结果是5)

strlen (*arr) --——--对arr数组名解引用操作会得到字符‘a’->ASCII码97(地址)后面不会再遇到'\0',而strlen遇到'\0'才会停止,所以这种写法就是错误的。

strlen (arr[1]) --——--同理可得,strlen(arr[1])也是错误的。

strlen (&arr) --——--&arr表示整个数组的地址," const char *" 类型 的 实参 与 " char *" 类型 的 形参不兼容, 函数 形参 为 char *的 类型 直接写入字符串报错。

二、字符数组 

char arr[ ]={'a','b','c','d','e','f'};
sizeof解析strlen
arr6数组大小随机值
arr+04/8首元素地址+0仍表示首地址随机值
*arr1*对首地址解引用表示首元素error
arr[1]1第一个元素error
&arr4/8数组地址随机
&arr+14/8+1跳过整个数组后的地址随机
$arr[0]+14/8第二个元素的地址随机

三、int型数组 

int a[ ]={1,2,3,4}
sizeof解析
a16数组总大小
a+04/8a表示首元素地址+0仍然是
*a4a是首元素地址*解引用表示首元素
a+14/8a是首地址+1表示第二个元素的地址
a[1]4第二个元素
&a4/8数组地址
*&a16数组地址解引用表示整个数组
&a+14/8数组地址+1跳过整个数组仍是地址
&a[0]4/8第一个元素地址
&a[0]+14/8第二个元素地址

四、字符指针

char*p="abcdef"
sizeof解析strlen
p4/8计算指针变量P的大小6
p+14/8字符b的地址5
*p1就是一个字符‘a'error
p[0]1==*(p+0)=='a'error
&p4/8地址随机
&p+14/8地址随机
&p[0]+14/8第二个元素地址5

五、二维数组

int a[3][4]={0};
sizeof解析
a483*4*4整个数组
a[0]16第一行
a[0][0]4第一个元素
a[0]+14/8第一行第二个元素地址
*(a[0]+1)4第一行第二个元素
a+14第二行地址,二维数组首元素地址是第一行(把二维看成一维)
*(a+1)16a[1]
&a[0]+14第二行地址
*(&a[0]+1)16
*a16第一行
a[3]16

 

 

 

标签:arr,--,元素,C语言,地址,数组,sizeof,strlen
From: https://blog.csdn.net/Jasmine5606/article/details/141468804

相关文章

  • 【C语言初级课程详解】第22课时-C语言结构体
    C 结构体C数组允许定义可存储相同类型数据项的变量,结构是C编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。结构体中的数据成员可以是基本数据类型(如int、float、char等),也可以是其他结构体类型、指针类型等。结构用于表示一条记录,假设您想要跟......
  • C语言——三子棋问题
     三子棋可以拆分为三部分:test.c——测试游戏的逻辑。game.h——放置游戏相关的头文件、符号声明、函数声明。game.c——游戏相关的函数实现。思路:保证游戏可以一直玩下去—— do...while循环打印一个简易菜单—— 函数menu();选择是否玩游戏——输入选择创建......
  • C语言经典一百例分享
    c练习实例1题目:有 1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?程序分析:可填在百位、十位、个位的数字都是 1、2、3、4,组成所有的排列后再去掉不满足条件的排列。实例:以上实例输出结果为:c练习实例2题目:企业发放的奖金根据利润提成。利润......
  • 【漫谈C语言和嵌入式029】信号传输的对决:差分信号 vs. 单端信号的全面比较
            在现代电子电路和通信系统中,信号传输方式的选择对于系统性能、抗干扰能力和功耗等方面至关重要。其中,差分信号(DifferentialSignal)和单端信号(Single-EndedSignal)是两种常见的信号传输方式。它们各有优劣,适用于不同的应用场景。本文将深入探讨这两种信号传输方......
  • 【漫谈C语言和嵌入式028】稳压器的选择之道:线性稳压器与开关稳压器的深入比较
            在电子电路设计中,稳压器(Regulator)是不可或缺的组件,用于提供稳定的输出电压以满足电路的需求。稳压器的种类多种多样,其中最常见的两大类是线性稳压器(LinearRegulator)和开关稳压器(SwitchingRegulator)。它们在工作原理、效率、复杂性等方面各具特点,适用于不同的......
  • 【漫谈C语言和嵌入式027】探索信号处理的秘密:低通滤波器与高通滤波器的深度解析
            在嵌入式系统和数字信号处理领域,滤波器(Filter)是至关重要的工具。它们是用于处理和优化信号的基础组件,能够有效地控制信号的频率分布。滤波器的类型多种多样,其中最为基础且常用的便是低通滤波器(Low-PassFilter,LPF)和高通滤波器(High-PassFilter,HPF)。本文将......
  • 【快速上手C语言】第十七章:安全编程与最佳实践 - C语言中的风险防范与防御性编程
            在嵌入式系统和底层开发中,安全性是至关重要的。C语言由于其灵活性和高效性,广泛应用于系统级编程。然而,C语言也容易导致各种安全问题,如缓冲区溢出、整数溢出等。这些问题如果不加以重视,可能会带来严重的安全隐患。本文将探讨C语言中的常见安全问题,介绍安全编码......
  • C语言中关于文件处理的常用函数
    目录标准IO流文本文件与二进制文件打开文件读写文件文本文件二进制文件文件定位关闭文件注意事项标准IO流在C语言中,流(Stream)是用于描述一切输入源或输出目的地的概念。流可以是键盘输入、屏幕输出,也可以是磁盘文件。标准流包括三个预定义的流:stdin:标准输入流,默......
  • C语言内存操作函数
    目录一.C语言内存操作函数1. memcpy的使用和模拟实现2.memmove函数3.memset函数4.memcmp函数一.C语言内存操作函数随着知识的不断积累,我们所想要实现的目标程序就会更加复杂,今天我们来学习一个新的知识叫做C语言内存操作函数,它是C语言标准库中提供的一系列对内存......
  • 【C语言】分析整型提升|截断
    这里通过例子来帮助理解整型提升和截断的规则。问题:赋值过程是怎样的?什么情况会发生截断?整型提升的规则是什么?根据什么类型来提升?%d,%u对整型提升后的结果有什么影响?例一#include<stdio.h>intmain(){ chara=-128; printf("%d\n",a); printf("%u\n",a); r......