为什么我的[arr]工作以及arr [i]在C中有较大的数据类型?

为什么我的[arr]工作以及arr [i]在C中有较大的数据类型?,第1张

概述这是相当普遍的知识,如果您在C中访问数组的元素为arr [i],那么您也可以访问元素为i [arr],因为这些元素被归结为*(arr i),而且是可交换的.我的问题是为什么这对于大于char的数据类型是有效的,因为sizeof(char)是1,对我来说,这应该只是通过一个char来提高指针. 这个例子可能更清楚一点: #include <string.h>#include <stdio.h> 这是相当普遍的知识,如果您在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( "%lu\n",sizeof( arr ) ); // prints 4096    strcpy( arr[0].data,"should not be accessed (and is not)" );    strcpy( arr[1].data,"Hello World!" );    printf( "%s,%s,%s\n",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)字节.

希望这可以帮助!

总结

以上是内存溢出为你收集整理的为什么我的[arr]工作以及arr [i]在C中有较大的数据类型?全部内容,希望文章能够帮你解决为什么我的[arr]工作以及arr [i]在C中有较大的数据类型?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1250191.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存