我对元素指针指向的大小有些困惑。包括一些可视化的基本代码。
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。
我缺少什么?
答案 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)};
答案 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"