C指针大小和被指向的值不匹配
用于msp430的IAR嵌入式工作台。精选C标准99 你好,我是新来的指针和困在一个地方。以下是代码的一部分:C指针大小和被指向的值不匹配,c,pointers,size,C,Pointers,Size,用于msp430的IAR嵌入式工作台。精选C标准99 你好,我是新来的指针和困在一个地方。以下是代码的一部分: void read_SPI_CS_P2(uint8_t read_from, int save_to, uint8_t bytes_to_read) { uint8_t * ptr; ptr = save_to; ... 根据我读到的指针,我假设: uint8_t*ptr;-这里我声明了指针指向的数据类型(我想保存uint8\u t值) ptr=保存到
void read_SPI_CS_P2(uint8_t read_from, int save_to, uint8_t bytes_to_read)
{
uint8_t * ptr;
ptr = save_to;
...
根据我读到的指针,我假设:
uint8_t*ptr;-这里我声明了指针指向的数据类型(我想保存uint8\u t值)
ptr=保存到;-这里我分配了我想写入的内存地址(它是0xF900 so int)
它给了我一个错误[Pe513]:类型为“int”的值不能分配给类型为“uint8\u t*的实体
问题是。。为什么?要保存的数据的大小(保存到)和内存地址的大小不能不同?从语法角度看,您可以将int直接转换为改变其值的指针。但在这种情况下,这可能不是一个好主意或对你有帮助的东西 您必须使用编译器和链接器支持来指示他们您需要内存中特定位置的一些数据。通常,您可以使用#pragma location语法(使用IAR工具链)执行此操作,使用类似以下内容:
__no_init volatile uint8_t g_u8SavingLocation @ 0xF900;
您不能简单地在内存中设置指针的值并在该位置开始写入。链接器负责决定内容在内存中的位置,您可以使用#pragma和链接器设置文件指示您要实现的目标。C语言没有立即功能,允许您创建指向任意数字地址的指针。在C语言中,指针是通过获取现有对象的地址(使用一元
&
运算符)或从内存分配函数(如malloc
)接收指针来获得的。此外,还可以创建空指针。在所有这些情况下,您永远不知道也不需要知道指针的实际数值
如果您想使指针指向一个特定的地址,那么抽象C语言在形式上无法帮助您。语言中根本没有这样的特性。但是,在语言的依赖于实现的部分中,特定编译器可以保证,如果强制将整数值(包含数字地址)转换为指针类型,则生成的指针将指向该地址。因此,如果在您的情况下,数字地址存储在save_to
变量中,您可以使用显式转换将其强制转换为指针
ptr = (unit8_t *) save_to;
演员阵容是必需的。在标准C中不允许直接将整数值赋给指针(但在前标准C中是允许的)
存储整数地址的更好类型是uintptr\u t
int
,或任何其他有符号类型,显然不是一个好的选择
另外,我不知道你在谈论尺码时想表达什么意思。“要保存的数据大小”与内存地址大小之间没有关系。为什么?这只是说不能直接将一个分配给另一个,因为它们是不同的类型。如果他们真的是一样大小,你可以通过一个明确的演员阵容来完成。谢谢你的回答,但问题是他们不能不同吗?为什么?我是这样看的:内存中有一个位置,要访问它,我需要在指针中有它的16位地址。当我可以访问这个地方时,我想在那里写8位数据,而不是8位,然后再空8位。为什么不可能呢?“您不能简单地在内存中设置指针的值,然后在该位置开始写入。”等等。。int*ptr;ptr=(int*)保存到;似乎工作正常,并将某物保存到地址保存到闪存(请让我换一种说法:-)我只是认为直接这样做通常不是一个好主意。在链接设置中设置可变位置是实现相同结果的更简洁的方法。见回复中的初始评论。