Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个指针在C中是什么?_C_Arrays_Pointers_Char - Fatal编程技术网

这个指针在C中是什么?

这个指针在C中是什么?,c,arrays,pointers,char,C,Arrays,Pointers,Char,我见过很多这样的类型,但我不知道这是什么意思 unsigned char somevar[MAXLEN]; int *ptr = (int *) somevar; 有人能解释一下吗?本质上,您将字符数组解释为指向int的指针。假设sizeof(int)为4,字符数组包含以下字节: b0 b1 b2 b3 b4 b5 b6 b7 现在ptr将指向b0,但威胁它为int。就是 ptr[0]是由字节b0、b1、b2和b3组成的整数 ptr[1]是由字节b4、b5、b6和b7组成的整数 HTH只是

我见过很多这样的类型,但我不知道这是什么意思

unsigned char somevar[MAXLEN];
int *ptr = (int *) somevar;

有人能解释一下吗?

本质上,您将字符数组解释为指向int的指针。假设
sizeof(int)
为4,字符数组包含以下字节:

b0 b1 b2 b3 b4 b5 b6 b7 
现在
ptr
将指向
b0
,但威胁它为
int
。就是

ptr[0]
是由字节
b0、b1、b2和b3组成的整数
ptr[1]
是由字节
b4、b5、b6和b7组成的整数


HTH

只是
somevar
将通过
ptr
指针被解释为
int
序列(或仅一个)。递增
ptr
仅一次即可将指针
sizeof(int)
向前移动字节

在进行这样的转换时,请注意endianness。来自
somevar
的字节可能需要重新排序才能正确解释为int


还要确保
somevar
的长度是
sizeof(int)
的倍数,否则在尝试访问最后一个
int
时会出现未定义的行为,因为它将部分可用。

C中数组的标识符是指向数组第一个元素的指针。因此,在您的示例中,somevar是一个无符号char*,指向代码段第一行中声明的数组的第一个元素

很明显,ptr也是指向数组第一个元素的指针,但由于typecast,它将其视为有符号整数


这不一定是一个好的类型转换,很可能int和char的大小完全不同,这可能会导致一些未定义的行为。

这通常是在从二进制文件或网络套接字读取一些原始字节时完成的,您知道(从数据格式或协议)这些字节序列表示一个整数。这将为您提供一个指针,您可以取消引用并获取由这些字节表示的整数值。

在右侧,它是指向int的指针

在左边,它是一个未知类型的变量(somevar),被转换成指向int的指针。我们最好用批判的眼光看待somevar。有时需要使用C语言进行铸造;但是,更常见的情况是,在C中强制转换表示为somevar选择了错误的类型,或者您正在做一些不太可能可移植的事情

在本例中,您正在将字符打包到int中。根据系统的不同,您可能会得到一个内部位表示与[char0,char1,char2,char3]匹配的int,然后是另一个内部位表示与chars four到seven匹配的int

但是,在其他一些系统上,您可能会得到一个内部位表示为[char3,char2,char1,char0]的int。最后,还有其他处理位顺序的系统甚至更为不同


很可能,如果你仔细研究代码,你会发现在另一个地方,指向“构造”int的指针被转换回char*

它是指向数组第一个值的指针。因为它是一个无符号字符,所以需要将其类型转换为int(当然不需要,但这是一个很好的实践)。根据某人对大小的担忧,大小int在大多数情况下总是小于无符号字符

数组的名称不是指针。它可以隐式转换为指针,但它不是指针。在这段代码所在的程序中,还有一个bswap32函数可以交换endiannes。此代码是无效的C代码,不会执行作者希望它执行的操作。不要复制它。@R:嗯?这是有效的,并且具有定义良好的行为。为什么不呢?
char*
类型的任意指针不一定满足
int
的对齐要求,并且可能无法忠实地存储在
int*
中(其位可能少于
char*
)。即使
int*
可以存储该值,但如果未满足对齐要求,则在尝试取消引用指针时,行为是未定义的。最后,还有别名方面的考虑,其中一种类型是
char
@R,这一事实大大缓解了别名问题。。我不能对C有100%的把握,因为我没有读过标准,但是在C++中,所有的参数都被处理了……AMAR:只有动态分配的数组使用<代码>新的char []/Cord>是这样保证的。堆栈或成员变量没有任何此类保证。C++0x中有一个
std::aligned_存储
,这是有原因的。