c - 指向保存地址的变量的指针

标签 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 作为 uint32 传递给 CRC 函数?

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

任何帮助将不胜感激,我不确定这是否可能。

最佳答案

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

在许多体系结构中,您可以将指针转换为数字并再次转换回来而不会丢失任何东西:

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

[这不适用于指针的“整数”与普通 int“整数”大小不同的体系结构。还有一些您几乎肯定不会关心的其他奇特案例。]

事实上,除了“是一个整数”之外,让指针做任何事情的唯一方法是取消引用它:

char c = *ptr;

或者,使用数组符号的完全相同的东西:

char c = ptr[0];

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

int v = ptr->value;

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

最后,您可以使用“寻址”运算符(也称为“引用”运算符)获取指向变量的指针:

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

关于c - 指向保存地址的变量的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17530218/

相关文章:

c - 为什么我的 C 函数无法处理标点符号?

c - 使用 select() 然后 read() 与阻塞 read() 循环

c - 链表:冒泡排序指针(C)

MATLAB:使用逻辑索引提取子矩阵

C char**,字符串数组空指针

c - 为什么 malloc 似乎允许我在内存上写入?

C++ linux 套接字在单个调用中将字符串数组(char **)作为连接字符串发送

c - 在函数之间传递参数

c - 为什么不在这种情况下使用 free()

ip - IP地址和MAC地址有什么区别?