指向变量持有地址的指针

时间:2013-07-08 15:15:58

标签: c pointers addressing

我正在尝试在8052嵌入式平台上为应用程序代码计算CRC32。

以下是计算CRC的指南:

void TestChecksum()
{
     unsigned short calc = 0;

     /* Run the checksum algorithm */
     calc = slow_crc16(0, (unsigned char *) ChecksumStart, (ChecksumEnd - ChecksumStart+1));

     /* Rotate out the answer */
     unsigned char zeros[2] = {0, 0};
     calc = slow_crc16(calc, zeros, 2);

     etc...
}

,其中

unsigned short slow_crc16(unsinged short sum, unsigned char *p, unsigned int len)
{
     while (len--)
     {
         int i;
         unsigned char byte = *(p++);

         for (i = 0; i < 8; ++i)
         {
          etc...
         }
}

示例的问题是指针自动指向XData,而我在CODE之后。我知道我想要计算CRC的代码的地址,比如0x2000到0x2FFF。

是否可以将指针定义为:

uint8_t __code *Ptr;

并传入一个地址,0x2000,作为CRC函数的uint32?

基本上我无法弄清楚如何获得指向实际存储为变量的地址的指针。

任何帮助都会受到赞赏,我不确定这是否可能。

1 个答案:

答案 0 :(得分:0)

指针一个整数;它只是有一种特殊的类型来阻止它与其他指针(或数字)混淆。

在许多体系结构中,您可以将指针转换为数字,然后再返回,而不会丢失任何内容:

char *ptr = (char *)0x2000;
int address = (int)ptr;

[这不适用于指针的“整数”与普通int“整数”不同的体系结构。还有一些其他奇特的案例,你几乎肯定也不在乎。]

事实上,获取指针除“是一个整数”以外的任何其他方法的唯一方法是取消引用它:

char c = *ptr;

或者,使用数组表示法完全相同:

char c = ptr[0];

或者,仅当ptr是指向struct类型的指针时:

int v = ptr->value;

在所有这些情况下,它使用指针作为地址,并从内存中提取引用的数据。

最后,你可以使用“address-of”运算符(a.k.a“reference”运算符)获取指向变量的指针:

char c = 'Z';
char *ptr = &c;