C联接指向数组的指针
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C联接指向数组的指针相关的知识,希望对你有一定的参考价值。
我有一个无符号的16位整数数组:
static uint16_t dataArray[7];
数组的第7个元素的位代表某种状态。我希望以简单的方式获取和设置此状态的值,无需进行位移,并且无需在每次状态更改时将新值复制到数组。所以我创建了一个带有结构和指针的联合:
typedef struct {
unsigned statusCode : 4;
unsigned errorCode : 4;
unsigned outputEnabled : 1;
unsigned currentClip : 1;
unsigned : 6;
} SupplyStruct_t;
typedef union {
SupplyStruct_t s;
uint16_t value;
} SupplyStatus_t;
static SupplyStatus_t * status;
我的初始化例程希望状态指针指向数组的第7个元素,所以我尝试了:
status = &(dataArray[6]);
虽然这有效,但我收到一个警告:从不兼容的指针类型中分配
有一个更好的方法吗?我无法更改数组,但我可以自由更改结构,联合或指向数组的指针。
答案
警告说uint16_t *与SupplyStatus_t *不兼容。如果您想摆脱此警告,请将其转换为SupplyStatus_t *:
status = (SupplyStatus_t*)&(dataArray[6]);
我也会将union和struct放在一起:
typedef union
{
struct
{
unsigned statusCode : 4;
unsigned errorCode : 4;
unsigned outputEnabled : 1;
unsigned currentClip :1;
unsigned unused : 6;
} s;
uint16_t value;
} SupplyStatus_t;
另一答案
- 将
unsigned
改为uint16_t
为什么? - 测试差异:https://ideone.com/uHLzpV
#include <stdio.h>
#include <stdint.h>
typedef struct {
uint16_t statusCode : 4;
unsigned errorCode : 4;
unsigned outputEnabled : 1;
unsigned currentClip : 1;
unsigned : 6;
} SupplyStruct_t;
typedef struct {
uint16_t statusCode : 4;
uint16_t errorCode : 4;
uint16_t outputEnabled : 1;
uint16_t currentClip : 1;
uint16_t : 6;
} SupplyStruct_t1;
typedef union {
SupplyStruct_t s;
uint16_t value;
} SupplyStatus_t;
typedef union {
SupplyStruct_t1 s;
uint16_t value;
} SupplyStatus_t1;
int main(void) {
printf("%zu %zu
", sizeof(SupplyStatus_t), sizeof(SupplyStatus_t1));
return 0;
}
最正确的方法是将表声明为结构表。
如果不 :
如果你想在位域上工作,你实际上不必声明指针。
static SupplyStatus_t status;
status.value = dataArray[6];
它几乎是便携和安全的方式
你也可以明确地投射它
以上是关于C联接指向数组的指针的主要内容,如果未能解决你的问题,请参考以下文章