C语法`Type varname[integer];`与+运算符的作用及Obj-C数组疑问
关于C数组与+运算符的疑问解答
问题1:C语法Type varname[integer];与+运算符结合的作用是什么?
咱们先从基础说起:Type varname[integer];是在栈上创建一个固定长度的数组,varname作为数组名,本质上是一个指向数组第一个元素的常量指针(注意是常量,不能直接给varname赋值)。
当它和+运算符结合时,这是指针算术操作:
varname + n会得到一个指向数组中第n个元素(从0开始计数,对应索引为n的元素)的指针- 举个例子:如果定义
int nums[5];,那么nums + 2等价于&nums[2],解引用*(nums + 2)和直接写nums[2]效果完全一致
简单来说,+在这里就是帮你计算数组中某个偏移位置的内存地址。
问题2:Objective-C中Byte seq[termLength];及memcpy(seq + bufLen, pre, preLen);的作用
其实你最初的判断完全没错!Byte seq[termLength];确实是在栈上创建了一个名为seq、长度为termLength的Byte(也就是unsigned char)类型数组,而且这块内存是未初始化的,里面的值是随机的垃圾数据。
至于你困惑的memcpy(seq + bufLen, pre, preLen);,结合刚才说的指针算术就很好理解了:
seq作为数组名被转换成指针,seq + bufLen就是指向seq数组中索引为bufLen的元素的地址memcpy的作用是把pre指向的内存中,长度为preLen的字节数据,拷贝到seq + bufLen指向的起始位置- 举个实际场景:如果
bufLen是3,preLen是2,那就是把pre里的2个字节,依次放到seq[3]和seq[4]的位置上
这种写法在需要手动拼接字节序列的时候特别常见,比如处理二进制数据、自定义协议包之类的场景。
内容的提问来源于stack exchange,提问作者Ky -
相关产品推荐
相关产品推荐

