为什么我的[arr]工作以及arr [i]在C中有较大的数据类型?
发布时间:2020-12-16 05:48:58 所属栏目:百科 来源:网络整理
导读:这是相当普遍的知识,如果您在C中访问数组的元素为arr [i],那么您也可以访问元素为i [arr],因为这些元素被归结为*(arr i),而且是可交换的.我的问题是为什么这对于大于char的数据类型是有效的,因为sizeof(char)是1,对我来说,这应该只是通过一个char来提高指针.
这是相当普遍的知识,如果您在C中访问数组的元素为arr [i],那么您也可以访问元素为i [arr],因为这些元素被归结为*(arr i),而且是可交换的.我的问题是为什么这对于大于char的数据类型是有效的,因为sizeof(char)是1,对我来说,这应该只是通过一个char来提高指针.
这个例子可能更清楚一点: #include <string.h> #include <stdio.h> struct large { char data[1024]; }; int main( int argc,char * argv[] ) { struct large arr[4]; memset( arr,sizeof( arr ) ); printf( "%lun",sizeof( arr ) ); // prints 4096 strcpy( arr[0].data,"should not be accessed (and is not)" ); strcpy( arr[1].data,"Hello world!" ); printf( "%s,%s,%sn",arr[1].data,1[arr].data,(*(arr+1)).data ); // prints Hello world!,Hello world!,Hello world! // I expected `hold not be accessed (and is not)' for #3 at least return 0; } 那么为什么在数组指针中添加一个可以通过sizeof(struct large)来推进呢? 解决方法
在C中,指针算术被定义为使得写入
ptr + k 不会将指针提前k字节,而是由k个对象.因此,如果你有一个指向整数数组和写入的指针 *(myIntArrayPointer + 3) 您将取消引用指向数组中索引3处的元素的指针,而不是从对象开头开始三个字节的整数. 类似地,如果减去两个指针,则可以得到它们之间的逻辑元素数,而不是总字节数.因此写作 (myIntArrayPointer + 3) - myIntArrayPointer 产生值3,即使它们之间有3 * sizeof(int)字节. 希望这可以帮助! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |