C语言中数组元素的下标可不可以是数组元素,另外··
2个回答
展开全部
C语言程序运行时,数组的存在形式是内存中的一块连续地址空间。而访问数组元素时,计算机会将下标做为空间首地址的偏移量来进行寻址,所以当然可以是任何整形数。
比如int array[10],array的地址是0x7FFFFF00,那么在访问array[3]时,计算机是这样计算的:
每个整形数大小为4个字节,所以用array的地址加上3乘以4,得到0x7FFFFF0C,那么从0x7FFFFF0C到0x7FFFFF0F这4个字节的值就是array[3]的值。
所以无论传入的下标是什么,理论上都可以计算得到一个地址,但是这个地址不一定是有效的。如果地址无效,就会发生段错误(segmentation fault),也即数组越界/地址访问越界。现在的编译器会认为只要下标是个整型变量,就是可以的,但是执行的时候操作系统仍然会进行监测,否则会影响其他程序的运行。
比如说a = {1, 2, 4, 5, 7}, b = { 1, 2, 3, 4, 5, 6, 7, 8 },那么b[a[3]] = b[5]=6,这个是可以允许的。
比如int array[10],array的地址是0x7FFFFF00,那么在访问array[3]时,计算机是这样计算的:
每个整形数大小为4个字节,所以用array的地址加上3乘以4,得到0x7FFFFF0C,那么从0x7FFFFF0C到0x7FFFFF0F这4个字节的值就是array[3]的值。
所以无论传入的下标是什么,理论上都可以计算得到一个地址,但是这个地址不一定是有效的。如果地址无效,就会发生段错误(segmentation fault),也即数组越界/地址访问越界。现在的编译器会认为只要下标是个整型变量,就是可以的,但是执行的时候操作系统仍然会进行监测,否则会影响其他程序的运行。
比如说a = {1, 2, 4, 5, 7}, b = { 1, 2, 3, 4, 5, 6, 7, 8 },那么b[a[3]] = b[5]=6,这个是可以允许的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |