指针大小,sizeof(p)与sizeof(*p)

本文详细介绍了将STM32程序移植到GD32平台的过程中遇到的挑战,特别是针对读写片内FLASH所需频繁的指针操作。通过具体代码示例,探讨了不同数据类型指针的大小及操作方式,为开发者提供了实践指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近需要把stm32的程序移植到GD32上,GD32的库函数没有意法做的丰富,所以许多操作需要自己实现,因为要用到读写片内FLASH,所以指针操作比较频繁,在实现过程中,对从前没有关注的一个指针操作:

 代码如下:

    #define iFOS_APP_ADDR       0x0800B400
    
  

/* 从地址中读取一个字节 */
    uint8_t data = 0;
    
    uint8_t *ptrd = NULL;
	
    ptrd = (uint8_t *)iFOS_APP_ADDR;

    data = *ptrd;


/* 从地址中读取4个字节(WORD) */

    uint32_t data = 0;
        
    __packed uint32_t *p_data = (uint32_t *)data;
    
    data = *p_data;

 代码如下: 

    uint8_t *p = NULL;
    uint32_t *m = NULL;

    DEBUG("sizeof uint8_t p = %d,sizeof uint8_t m = %d",sizeof(p),sizeof(m));
    DEBUG("sizeof uint8_t *p = %d,sizeof uint8_t *m = %d",sizeof(*p),sizeof(*m));

执行结果:

           <main>  sizeof uint8_t p = 4,sizeof uint8_t m = 4
           <main>  sizeof uint8_t *p = 1,sizeof uint8_t *m = 4


 

### `sizeof(*p)` 的含义用法 在 C/C++ 中,`sizeof(*p)` 是一个非常常见的表达式,用于获取指针 `p` 所指向的数据类型的大小(以字节为单位)。它的作用指针的类型密切相关,而不是指针本身的地址。 #### 含义解析 - `p` 是一个指针变量,它存储的是某个数据对象的地址。 - `*p` 是对指针 `p` 进行解引用,表示 `p` 所指向的对象。 - `sizeof(*p)` 返回的是 `p` 所指向的数据类型的大小,而不是指针本身的大小。 例如,若 `p` 是一个 `int*` 类型的指针,则 `sizeof(*p)` 的结果为 `int` 类型的大小,通常为 4 字节(在大多数现代系统中)[^2]。 #### 使用场景 1. **动态内存分配**:在使用 `malloc` 或 `calloc` 时,`sizeof(*p)` 常用于计算所需分配的内存大小,避免硬编码类型大小。 ```c int* p = (int*)malloc(10 * sizeof(*p)); ``` 此处 `sizeof(*p)` 等价于 `sizeof(int)`,表示为 10 个整型元素分配内存空间。 2. **数组遍历拷贝**:在操作数组时,`sizeof(*p)` 可用于计算数组元素的大小,便于进行指针移动或拷贝。 ```c int arr[10]; int* p = arr; for(int i = 0; i < 10; ++i) { // 操作每个元素 *(p + i) = i; } ``` 此处 `p + i` 会根据 `sizeof(*p)` 自动进行指针算术运算,正确地跳转到下一个元素的位置。 3. **通用指针处理**:在处理泛型代码(如使用 `void*`)时,结合 `sizeof(*p)` 可以动态获取不同类型的数据大小,便于实现通用的数据结构操作函数。 #### 注意事项 - `sizeof(*p)` 的结果取决于指针的类型,而不是指针当前指向的内存内容。 - 若指针类型为 `void*`,则不能直接使用 `sizeof(*p)`,因为 `void` 是不完整类型,无法确定大小。需要先将其转换为具体类型的指针。 ```c void* ptr = malloc(10 * sizeof(int)); int* p = (int*)ptr; size_t size = sizeof(*p); // 正确:等价于 sizeof(int) ``` - 在 32 位系统中,指针本身的大小为 4 字节,即 `sizeof(p)` 返回 4,而 `sizeof(*p)` 则取决于指针所指向的类型。 #### 示例代码 ```c #include <stdio.h> int main() { int* p; printf("Size of pointer: %zu\n", sizeof(p)); // 输出指针大小,通常为4字节(32位系统) printf("Size of pointed data: %zu\n", sizeof(*p)); // 输出int大小,通常为4字节 int arr[10]; printf("Size of array: %zu\n", sizeof(arr)); // 输出整个数组大小,即10 * sizeof(int) printf("Size of element: %zu\n", sizeof(arr[0])); // 输出单个元素大小,即sizeof(int) return 0; } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值