c、c++两个指针变量的相减,需要注意两个变量的数据类型。
如下例程:
#include "stdio.h"
#include "string.h"
using namespace std;
#define uint8_t unsigned char
#define uint16_t unsigned short int
#define uint32_t unsigned int
typedef struct{
int val;
char numer;
}SB_TypeDef;
SB_TypeDef sb[2] = { { 1, 2 }, {3,4} };
#define DATA_TYPE uint8_t
void main()
{
uint8_t *pSB = (uint8_t *)&sb;
printf("%d %d \r\n",sb[0].numer, sb[1].val);
DATA_TYPE *pSb0 = (DATA_TYPE *)&sb[0];
DATA_TYPE *pSb1 = (DATA_TYPE *)&sb[1];
uint32_t diff_addr = pSb1 - pSb0;
printf("addr0:0x%x \r\n addr1:0x%x\r\n addr3:0x%x\r\n", pSb0, pSb1, diff_addr);
}
定义结构体类型SB_TypeDef,其长度sizeof(SB_TypeDef)是8,定义两个SB_TypeDef类型的结构体sb[0]、sb[1],这两个结构体物理地址相差是8,但(&sb[1] - &sb[0])是多少呢?当然是1了,若把这两个结构体的指针类型转为其他类型,则又是其他差值了。
- #define DATA_TYPE uint8_t
转为uint8_t类型的指针:
地址相差8
- #define DATA_TYPE uint32_t
转为uint32_t类型的指针:
地址相差2
- #define DATA_TYPE SB_TypeDef
转为SB_TypeDef类型的指针:
地址相差1