对象指针的sizeof指向

时间:2019-04-06 17:12:33

标签: c

我对元素指针指向的大小有些困惑。包括一些可视化的基本代码。

uint8_t var1;
uint8_t var2;

uint8_t *p[2]={&var1,&var2};

sizeof(* p)的结果是4而不是1,为什么呢?

uint8_t var1;
uint8_t *p=&var1;

在此代码结果中,正确的sizeof(* p)为1。

我缺少什么?

4 个答案:

答案 0 :(得分:1)

请注意,数组p会衰减为一个指针,并且由于该数组本身就是一个指针数组,所以它也是一个指针。

#include <stdio.h>

int main(void)
{
    char var1;
    char var2;
    char *p[2] = { &var1, &var2 };
    printf("%zu\n", sizeof(*p));    // size of each element
    printf("%zu\n", sizeof(**p));   // size of dereferenced element
    return 0; 
}

程序输出

4
1

答案 1 :(得分:0)

这是因为在您的第一个示例中,粗略地说,p是所谓的双指针或指向指针的指针,因为它被定义为指向数组的指针。因此,当取消引用它时,*p会得到一个指针,而不是uint8_t类型的对象。

因此,ARM M4上的指针大小实际上是4个字节。

答案 2 :(得分:0)

不是指针的大小,而是引用对象的大小。

在第一个示例中,它是指针,在第二个uint8_t中,

很容易确认:

uint8_t v8;
uint16_t v16;
uint32_t v32;
uint64_t v64;

double vd;
float vf;

uint8_t *v8p = &v8;
uint16_t *v16p = &v16;
uint32_t *v32p = &v32;
uint64_t *v64p = &v64;

double *vdp = &vd;
float *vfp = &vf;


volatile size_t sizes[] = {sizeof(*v8p), sizeof(*v16p), sizeof(*v32p), sizeof(*v64p), sizeof(*vdp), sizeof(*vfp)};

和结果: (使用M4 uC-STM32F476) enter image description here

答案 3 :(得分:0)

sizeOf(*p)

这将计算类型的大小,该类型位于p值中存储的地址处,即指向uint8_t的指针。

sizeOf(*p[0])

这是存储在数组的第零个元素的值中的地址处的类型的大小,该大小从p的值中存储的地址开始。

uint8_t *p[2]={&var1,&var2};

这声明p的值是指向uint8_t的指针数组中第一个对象的地址。

这不会取消引用p。 *和[]都不具有左值。

如果您将其视为数学术语,而不是像使用命令那样代数运算,那么取消引用运算符的语义就更有意义了。

"√ 2"         : "the square root of 2"
" *p"         :  "the dereference of p"
...
"x = *p"      : "set the value of x to the dereference of p"
"int *p"      : "has type int: the dereference of p"