sizeof获取数组长度

sizeof获取数组长度昨天开始看 算法导论 这本书 第一个算法就是 直接 插入排序 根据书里给出的伪代码写出了 C 语言代码 也根据自己的理解重新写了一个 虽然实现了算法的基本要求 但有些细节没有处理好 今天就来完善一下 在昨天实现的代码中 用来测试的数组 intarray 5 2 4 6 1 3 是固定的 如果要更换待排序数组话 原来程序中的相关变量就会因为数组长度的改变要做相应的改变 我想要的就是给定任

昨天开始看《算法导论》这本书,第一个算法就是(直接)插入排序,根据书里给出的伪代码写出了C语言代码,也根据自己的理解重新写了一个。虽然实现了算法的基本要求,但有些细节没有处理好,今天就来完善一下。

在昨天实现的代码中,用来测试的数组int array[] = {5,2,4,6,1,3};是固定的,如果要更换待排序数组话,原来程序中的相关变量就会因为数组长度的改变要做相应的改变。我想要的就是给定任意的数组,在不修改任意代码的条件下实现插入排序。所以,核心问题就是怎么获取给定数组中的元素个数。

自然而然想到的就是sizeof(C/C++中的一个操作符,其功能是返回一个对象或者类型所占的内存字节数)。

一、首先来看看怎么获取整数数组的长度

sizeof的语法形式如下:

个人喜欢使用sizeof()的形式,因为形式统一,而且可以避免引起混乱导致出错。

假设有一给定数组 int array[] = {5,2,4,6,1,3};

length为数组array[]中的元素个数,那么

length = sizeof(array)/sizeof(*array); //表达式1 //length = sizeof(array)/sizeof(array[0]); //表达式2 //length = sizeof(array)/sizeof(int); //表达式3

上述三个表达式都能得到正确的结果,虽然表达式略有不同,但原理是相同的,即通过sizeof(array)获取整个数组所占的内存字节数,再通过sizeof(*array)或者sizeof(array[0])或者sizeof(int)来获取每个元素所占的字节数,数组所占的字节数除以每个元素所占的字节数就是该数组的元素个数了。

二、字符串数组长度的获取

char str[] = {"This is a string!"}; length = sizeof(str)-1;//包含空格

之所结果要减1,是因为字符串结束符’\0‘在数组中占用了一个字节。

三、源代码

/ *获取字符串长度(元素个数) By 羽墨 *print_length.c */ #include 
  
    void main() { int array[] = {5,2,4,6,1,3}; char str[] = {"This is a string!"};     int length = sizeof(array)/sizeof(*array); printf("The length of string '%s' is %d\n",str,sizeof(str)-1); printf("The length of array is %d\n",length); } 
  

运行结果

The length of string 'This is a string!' is 17 The length of array is 6

四、注意

1、如果在定义数组时就给定了数组的大小,如int array[len];,则不管数组中初始化了多少个(显然应不大于len)元素,最后的数组中的元素个数都是len。所以要想获得数组中真实元素的个数,在初始化数组时应注意这一点。

2、向子函数传递数组后,然后在子函数内部获取数组长度。先来看一个错误示例程序:

int getLength(int array[]) { int length; length=sizeof(array)/sizeof(array[0]); return length; } len = getLength(array); printf("The length of array is %d\n",len);

这样得到的结果始终都是1。因为数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址。在本示例中,函数名array传递到子函数后就完全退化为一个指针,该指针指向的是数组array所在的地址,即数组array第一个元素array[0]所在的地址。也就是说系统只是告诉该函数这个存储空间存有数据,但并没有告诉函数这个数据存储空间有多大。sizeof(array)的结果是指针变量array所占内存的字节数,具体大小与系统有关,一般在32位机器上占4个字节,array[0]是int类型,同样占4个字节,所以结果为1。所以要获得数组的长度最好在数组定义所在的区域内。

对于上述情形,查阅资料后给出两种解决方案:

(1)进入子函数后用函数memcpy将数组拷贝出来,函数memcpy所需要的长度由另一个形参传递进来,像这样:

#include 
  
    #include 
   
     #include 
    
      / *摘自360百科(稍作修改) By 羽墨 *将数组内容拷贝到函数内部 */ void fun(char *p, int len) { char *pData; pData = (char*) malloc (len+1);      //申请内存空间 memcpy(pData, p, len+1);             //拷贝数组 printf("%s\n",pData); //计算数组大小(略) free(pData);                         //释放内存 pData = NULL; } int main(int argc, char *argv[]) { char str[] = {"This is a string!"};//初始化数组 fun(str, 17); return 0; } 
     
    
  

个人觉得没有必要怎么做。如果能够所需的长度作为形参传递到子函数中,显然就不需要在子函数当中另行计算,so,请看另一个方案。

(2)在子函数外部计算好元素个数后作为形参传递到子函数中进行其他操作。在这里仅给出(直接)插入排序算法的main函数,insert_sort(array,length)函数只需将子函数中用于记录数组元素个数的临时变量length放进子函数的参数列表即可。

#include 
  
    void print_array(int *arr, int len); int main(int argc, char *argv[]) { int array[] = {5,2,4,6,1,3}; char str[] = {"This is a string!"}; int length = sizeof(array)/sizeof(*array);    //计算数组中的元素个数 printf("The original"); print_array(array, length); insert_sort(array,length);                     //插入排序 printf("The sorted"); print_array(array, length);                    //输出排序结果 return 0; } void print_array(int *arr, int len) { int i = 0; for(i=0;i 
    
  

这样一来,对于任意的目标序列都可以直接进行排序而不需要修改任何程序语句。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203857.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午9:26
下一篇 2026年3月19日 下午9:27


相关推荐

  • macos dock栏_苹果mac使用技巧

    macos dock栏_苹果mac使用技巧Dock栏就是Mac电脑屏幕下方的那一排快捷键,我们可以把自己常用的程序放到Dock上面,这样可以帮助我们快速的打开自己想要打开的文件和程序,默认情况下,OSX的Dock置于屏幕的底部。当你第一次进入MacOSX的桌面,Dock中内置了许多应用程序,怎么用好它?其实,我们不仅可以自定义Dock中显示的内容,而且你还可以调整Dock的大小、位置等等,下面给大家介绍几个关于Dock栏使用技巧,让大家使用Mac电脑更加得心应手。一、添加应用程序,文件夹和文件到Dock1.打开你的

    2025年8月27日
    7
  • idea注释模板

    idea注释模板idea 注释模板软件版本文件模板方法模板软件版本 IntelliJIDEA 3 5 文件模板 File gt Settings 搜索 FileandCode 找到自己需要注释的文件类型 添加自己注释如我需要添加 class interface enum 三种文件 修改好点击 apply 说明 TODO author USER date DATE TIME version1 0 publicenum NAME 如果

    2026年3月18日
    2
  • Cursor是GitHub Copilot的最佳平替?Cursor详细使用教程

    Cursor是GitHub Copilot的最佳平替?Cursor详细使用教程

    2026年3月15日
    2
  • 目标检测中的IoU、GIoU、DIoU与CIoU

    目标检测中的IoU、GIoU、DIoU与CIoU什么是 IOU 简单来说 IOU 就是用来度量目标检测中预测框与真实框的重叠程度 在图像分类中 有一个明确的指标准确率来衡量模型分类模型的好坏 其公式为 acc PtrueNN 全部样本的数量 Ptrue 预测正确的样本数量 acc frac P true N quad quad quad quad quad quad quad N 全部样本的数量 P true 预测正确的样本数量 acc NPtrue N 全部样本的数量 Ptrue 预测正确的样本数量这个

    2026年3月17日
    2
  • java实现发送邮件工具[通俗易懂]

    java实现发送邮件工具[通俗易懂]java实现发送邮件的功能:首先需要导入mail.jar;然后需要写发送方法:1、邮箱发送封装工具类:packagecom.wxjiameng.utils;importjava.util.Date;importjava.util.Properties;importjavax.activation.DataHandler;importjavax.activation.FileDa

    2022年5月14日
    35
  • 易语言脚本开发入门教程

    易语言脚本开发入门教程天蓝易语言脚本入门开发系列教程第 1 讲初识易语言天蓝易语言脚本入门开发系列教程第 2 课简单控件变量天蓝易语言脚本入门开发系列教程第 3 讲简单登录器制作天蓝易语言脚本入门开发系列教程第 4 讲计算器实现天蓝易语言脚本入门开发系列教程第 5 讲时钟随机数天蓝易语言脚本入门开发系列教程第 6 讲子程序的应用天蓝易语言脚本入门开发系列教程第 7 讲选择夹列表框天蓝易语言脚本入门开发系列教程第 8 讲读写配置项天蓝易语言脚本入门开发系列教程第 9 讲数组天蓝易语言脚本入门开发系列教程第 10 讲分割文本读取帐号密码天蓝易

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号