`

如何求c语言中数组长度(sizeof)-->编译原理很重要

 
阅读更多
#include "stdio.h"

void getlen(char a[]);
main()
{
  char a[]="12345";
  printf("%d\n",sizeof(a));//这里可以通过数组名求出数组长度 
  getlen(a);
  
  getchar();  
}

void getlen(char a[])  //当数组名退化成指针以后是求不出数组长度了
{
  printf("%d\n",sizeof(a));     
}

执行结果:



如果作为函数的参数是没法求的,
> 但这样是可以的:
>
> #define LENGTH(s) (sizeof(s) / sizeof(int))
>
> int s[12];
> int length = LENGTH(s);
==================================================
这样的方法只能用于数组变量的数组名,对于指向数组的指针,以及作为参数的数组名都是没有效果的,上面已经有人解释了
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
不可能有办法的。
当你定义一个数组的时候:
int a[] = {1, 2, 3}; // 实际上被编译为 int a[3] = {1,2,3}

数组名代表的是数组的地址。注意 —— 你绝对没有办法通过数组名动态获得数组的大小。当你丢失a的长度信息的时候,你永远不可能知道他的长度。

那么 sizeof 是怎么回事呢?他不是通过 a 的名字获得 a的大小了么? —— 大错特错!

关键字 sizeof 产生的是一个编译期常量(注1) 他的运作方式是这样的:

当你写:
sizeof a
实质是:
sizeof ( a的类型 )

而a的类型是什么呢?编译器察看 a的定义发现, 是 int [3]
就是说,这里 sizeof a 实质是:
sizeof ( int[3] )
完全等同于常量 12 (假定int为4字节)。


考虑一个函数
void func( int a[] );
// 写成 int a[3] 也不会有本质区别——也许你该试试写成 int (&a) [3] ?

C++规定,数组作为形参的时候,a代表数组首地址。
他的底层意义是: a 退化为了一个4字节的指针,没有任何变量表示数组的大小会“自动”被传递进来。

我们看看这个时候 sizeof a是什么:
sizeof( 函数形参的a[] ) = sizeof( int* const ) = 4 // 当然a[]不是合法的C++类型


仍然不服气?好——我们反问一个问题:若你是C /C++的设计者, 你怎么在兼容原有设计的基础上让void func( int a[] )同时传递地址和大小?

首先,a是一个变量,而且类似数组。他必须是一个地址,否则你不知道如何索引元素。
他怎么再带上一个变量表示他的大小呢?

扩充 sizeof (a) 的能力?

sizeof a 必须产生代码——不管是常量还是什么。 要让他在运行时决定 a的值, a就必须带上他的大小信息。

1 你必须修改C标准,让C支持“两种”数组。一种是定义处的数组,他分配大片连续内存,和原来的C标准相同。

2 另一种是作为参数传递数组。 你必须传递地址和数组大小;这个数组实际上是一个8字节的结构{ 地址; 大小}(事实上可能更加复杂,考虑多纬数组如何实现? )

3 系统必须根据两种不同数组分别实现其 []、* 、&等。 原有的数组根据其首地址偏移(这是个常量)和下标寻址; 而参数数组则首先取“地址”内容(这是个变量),然后根据这个地址寻址....

厄... 再考虑多维数组——听起来这不是一整套vector模型么?

-----------------------------------------------
注1: 对于C99支持的 flexible array ,其 sizeof 运算是运行时求值

分享到:
评论

相关推荐

    C语言数组初学者ppt

    【C语言数组初学者知识点详解】 C语言中的数组是一种非常基础且重要的数据结构,它允许存储一组具有相同数据类型的元素。对于初学者来说,理解数组的概念、定义和使用方法是学习C语言的关键步骤。 1. **数组的概念...

    c语言动态数组的实现方法

    在C语言中,动态数组是一种在程序运行时根据需要分配内存的方法,这与静态数组在编译时就确定大小有所不同。动态数组的实现主要依赖于内存管理函数`malloc()`、`calloc()`、`realloc()`和`free()`。下面将详细讨论`...

    浅谈C语言中数组变量的教学.pdf

    - 数组长度在编译时是固定的,不能在运行时改变。 - 当传递数组给函数时,数组的长度信息不会传递,因此需要在函数参数中显式指定或作为额外参数传递。 理解并熟练掌握数组是学习C语言的关键步骤,它不仅涉及到基本...

    数据结构-c语言-带main函数-串1-串的长度-标准库函数strlen()和sizeof()的两种方法。

    在本教程中,我们将探讨如何在C语言中计算字符串的长度,这是数据结构中的一个重要概念,特别是在处理字符数组时。我们将通过两种方法来实现:使用标准库函数`strlen()`和`sizeof()`。 首先,我们来看第一种方法,...

    C语言程序设计-1期 单元5 构造类型程序设计_数组.pdf

    6. 数组长度计算: - 如果`int`占2个字节,数组`int b[8]`占用的字节数是8 * 2 = 16字节。 7. 给数组输入数据: - 通过`scanf`给数组输入数据时,应使用`a+(i++)`,确保每次迭代时增加i的值。 8. 数组元素的访问...

    C语言中的数组(详解)

    在C语言中,数组是一种非常基础且重要的数据结构,它允许程序员存储一组相同类型的元素。本文将深入探讨C语言中的数组,包括数组的定义、声明、初始化、访问、以及一些常见的操作。 一、数组的定义与声明 数组的...

    c 语言数组结构实例

    从给定的文件标题“C语言数组结构实例”和描述中,我们可以提炼出关于C语言中数组处理的关键知识点。以下是对这些知识点的详细解析: ### C语言中的数组 #### 动态数组 在C语言中,标准数组是在编译时就确定了大小...

    一文掌握C语言数组使用.pdf

    数组长度在程序运行过程中是固定的,不能更改。 数组的定义语法遵循以下规则:数组类型后面跟着数组名,然后是一个中括号,里面是数组的大小。数组大小必须是编译时已知的非负整数,不能是变量。例如,`int myArray...

    C语言复习题数组.pdf

    在C语言中,数组的长度在编译时必须是已知的,这意味着不能动态地改变数组的大小。 1. 填空题: - `strlen(a)` 函数返回字符串的长度,不包括结束符`\0`,所以`strlen(a)`的值是6,因为字符串"\3Love\3"的有效字符...

    c语言习题 (数组).zip

    这个“c语言习题(数组).zip”文件很可能包含了一系列关于C语言数组的练习题目,帮助学习者深化对数组的理解和应用。 数组在C语言中的基本概念是这样的:数组是一个同类型的元素序列,它们在内存中是连续存储的。...

    数组的定义,初始化和使用,C语言数组详解.pdf

    在C语言中,数组是一种非常基础且重要的数据结构。它允许程序员存储一组相同类型的元素,这些元素通过它们在内存中的位置来访问。本篇将详细解释C语言中的数组定义、初始化以及使用方法。 1. 数组的定义: 数组在...

    C语言动态数组的使用实现代码

    // 从键盘读取数组长度 scanf("%d", &N); // 动态分配内存 int *a = (int*)malloc(N * sizeof(int)); // 分配N个整数的空间 if(a == NULL) { // 检查内存分配是否成功 printf("Memory allocation failed.\n...

    C语言 数组

    以下是一些关于C语言数组的重要知识点: 1. **数组的声明与初始化**:数组可以在声明时被初始化,例如`char array[] = "China";`会创建一个包含6个字符的数组,包括字符串结束符'\0'。数组`array`占用6个字节的内存...

    C语言柔性数组实例详解

    柔性数组成员的定义使得结构体可以适应不同大小的数据,而不需要预先知道确切的数组长度。在C99标准中引入了这一特性,以支持更灵活的数据结构设计。 不完整类型是指在声明时没有提供足够的信息来完全描述一个对象...

    C语言典型实例

    ### C语言典型实例知识点概述 #### 一、走进C语言的世界 **实例1:第一个C语言程序** - **实例描述**:本实例演示了如何编写并运行一个简单的C语言程序,通常是一个“Hello, World!”程序。 - **实现过程**: 1. ...

    查找字符串中最小字符串-C语言代码

    这个问题通常涉及比较字符串长度,找到字符串数组中长度最短的那一个。这里,我们将会深入探讨如何使用C语言来解决这个问题,并通过实际代码示例进行讲解。 首先,我们需要理解C语言中的字符串是如何表示的。在...

    C语言介绍sizeof的使用方法,可以直接编译使用

    程序通过简洁的代码展示了如何使用sizeof来查找各种变量类型的大小,这是C语言编程中重要的一环,非常适合初学者进行学习。 程序的主要目标是确定各种类型的变量在内存中的大小。 程序的开头,我们包含了stdio.h...

    计算机编程C语言-预处理

    数组的使用包括取值、赋值、计算数组长度等。例如:`int nums[5] = {1,2,3,4,5}; nums[0] = 10;`。数组的长度可以使用`sizeof`运算符计算,例如:`int length = sizeof(nums) / sizeof(nums[0]);`。 二、预处理命令...

    c语言进阶教程

    在C语言的学习过程中,数组是一个非常基础且重要的概念。本文将从五个不同的层次出发,探讨数组在C语言中的多种使用方法,特别是针对指针的深入理解与实践。从静态数组的基础用法,到动态数组的灵活运用,再到变长...

Global site tag (gtag.js) - Google Analytics