您好,欢迎来到99网。
搜索
您的当前位置:首页C语言中第一维数组的大小的准确定义

C语言中第一维数组的大小的准确定义

来源:99网

有网友碰到这样的问题“C语言中第一维数组的大小的准确定义”。小编为您整理了以下解决方案,希望对您有帮助:

解决方案1:

ANSI C标准中规定,一个数组的尺寸(下标)必须是一个整型常量表达式以便于在编译时计算大小,而这里的所谓常量(或者常量表达式的运算结果),一般是指unsigned int。

16位编译器(比如Turbo C)中,unsigned int为16位,因此数组最多32767个数据。

32位编译器(比如Visual C++ 6.0)中,unsigned int为32位,因此数组最多4294967295个数据。

以上结论为理论值。

实际上,在VC++中,我们定义一个259025元素的整型数组,虽然可以编译通过,但是我们仍将得到一个运行时错误(runtime error)。这主要跟堆和栈的大小有关,详细情况请查阅操作系统相关资料。

错误代码范例:

// VC++ 6.0 中
void main()
{
int a[259025]; // 运行时错误,259024是ok的。
char b[259025]; // ok。
char c[1036097]; // 运行时错误,1036096是ok的。
}

// TC2.0 中
void main()
{
int a[32768]; // 编译错误,32767是ok的。
char b[65536]; // 编译错误,65535是ok的。
}

解决方案2:

指针与数组
1)用指针编写的程序比用数组下标编写的程序执行速度快,但另一方面,用指针实现的程序理解起来稍微困难一些

2)例如:int a[10]; int *pa;
pa = &a[0];则可以将指针pa指向数组a的第0个元素,也就是说,pa的值为数组元素a[0]的地址
x = *pa; 将把数组元素a[0]中的内容复制到变量x中
pa + 1; 如果pa指向数组中的某个特定元素,那么,根据指针运算的定义,pa+1将指向下一个元素
pa + i; 将指向pa所指向数组元素之后的第i个元素
pa - i; 将指向pa所指向数组元素之前的第i个元素
因此,如果指针pa指向a[0],那么*(pa+1)引用的是数组元素a[1]的内容,pa+i是数组元素a[i]的地址,*(pa+i)引用的是数组元素a[i]的内容
pa = &a[0]; <=> pa =a; pa和a具有相同的值,因为数组名所代表的就是该数组最开始的一个元素的地址
对数组元素a[i]的引用也可以写成*(a+i)这种形式
在计算数组元素a[i]的值时,C语言实际上先将其转换为*(a+i)的形式,然后再进行求值,因此在程序中这两种形式是等价的
&a[i] <=> a+i; 两者等价,a+i是a之后第i个元素的地址
pa[i] <=> *(pa+i) 如果pa是一个指针,那么,在表达式中也可以在它的后面加下标

3)数组名和指针之间有一个不同之处。指针是一个变量,因此,在C语言中,语句pa=a和pa++都是合法的。但数组名不是变量,因此类似于a=pa和a++形式的语句是非法的。

4)当把数组名传递给一个函数时,实际上传递的是该数组第一个元素的地址。在被调用函数中,该参数是一个局部变量,因此,数组名参数必须是一个指针,也就是一个存储地址值的变量。

5)在函数定义中,形式参数char s[];和char *s;是等价的。如果将数组名传递给函数,函数可以根据情况判定是按照数组处理还是按照指针处理,在函数中甚至可以同时使用数组和指针这两种表示方法。
在函数f(int arr[]){...} 和 f(int *arr){...}中
f(&a[2])与f(a+2)都将把起始于a[2]的子数组的地址传递给函数f

6)如果确信相应的元素存在,也可以通过下标访问数组第一个元素之前的元素。类似于p[-1],p[-2]这样的表达式在语法上都是合法的,它们分别引用位于p[0]之前的两个元素。当然,引用数组边界之外的对象是非法的。

解决方案3:

楼上两个也太夸张了把。
举个例子数组a[10]代表数组a中有10个元素 而a中的元素分别为
a[0],a[1],......,a[9]

Copyright © 2019- 99spj.com 版权所有 湘ICP备2022005869号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务