C:地址运算符 (&) 产生一个指针(地址 + 类型)还是只是一个地址?
C: Does the address operator (&) produce a pointer (address + type) or just an address?
我读到的关于地址运算符 &
的大部分内容都说它用于获取地址。不过,我最近听说它的描述有所不同,因为它生成了一个成熟的指针。
给定以下 C 代码,
int i1 = 5;
int *p1;
p = &i1;
我的理解是 p1
通过存储存储 i1
数据的地址来引用 int 5
并记住该位置的数据将被解释为int
(指示要读取多少字节以及如何解释读取的数据)。
地址运算符是否同时产生地址和 "type-awareness",或者类型意识只是隐含的,因为 p1
被声明为 int
指针?
让我对此感到疑惑的一件事是看到如下代码:
void myFunc(int *ptr);
int i = 5;
myFunc(&i);
虽然您认为 &i1
的类型是 int*
是对的,但我认为您对这个想法的重视程度过高。我不会将 C 中的任何内容描述为 "type-awareness",而且绝对没有 "remembering that the data in that location is to be interpreted as type int
"。 C 类型仅存在于源代码级别,编译后不存在。
这在联合示例中可能更清楚:
union something {
int a;
char b;
};
现在,如果您有一个类型为 something
的变量 x
,您可以有类型为 int*
的 &x.a
和类型为 [=19] 的 &x.b
=],但他们指向同一个地址。
变量 i1
的类型为 int
,因此表达式 &i1
采用 int
的地址,产生类型为 int *
的表达式。然后将此表达式分配给 p1
,它也是 int *
.
类型
所以现在 p1
指向 i1
的内存位置,所以表达式 *p1
将是 5
.
&
运算符只是 returns 指向其操作数的指针。如果其操作数是 int
,则结果类型将为 int*
。如果其操作数是 int*
,则结果类型将为 int**
。例如这个程序:
#include <stdio.h>
struct test {
int a;
int b;
int d;
};
int main ( ) {
struct test foo = { 0, 0, 0 } ;
printf( "%lu\n", (unsigned long)(&foo + 2) - (unsigned long)&foo );
}
在我的机器上输出24,因为sizeof(struct test)
是12,而&foo
的类型已知是struct test *
,所以&foo + 2
计算的偏移量是2 struct test
s.
我读到的关于地址运算符 &
的大部分内容都说它用于获取地址。不过,我最近听说它的描述有所不同,因为它生成了一个成熟的指针。
给定以下 C 代码,
int i1 = 5;
int *p1;
p = &i1;
我的理解是 p1
通过存储存储 i1
数据的地址来引用 int 5
并记住该位置的数据将被解释为int
(指示要读取多少字节以及如何解释读取的数据)。
地址运算符是否同时产生地址和 "type-awareness",或者类型意识只是隐含的,因为 p1
被声明为 int
指针?
让我对此感到疑惑的一件事是看到如下代码:
void myFunc(int *ptr);
int i = 5;
myFunc(&i);
虽然您认为 &i1
的类型是 int*
是对的,但我认为您对这个想法的重视程度过高。我不会将 C 中的任何内容描述为 "type-awareness",而且绝对没有 "remembering that the data in that location is to be interpreted as type int
"。 C 类型仅存在于源代码级别,编译后不存在。
这在联合示例中可能更清楚:
union something {
int a;
char b;
};
现在,如果您有一个类型为 something
的变量 x
,您可以有类型为 int*
的 &x.a
和类型为 [=19] 的 &x.b
=],但他们指向同一个地址。
变量 i1
的类型为 int
,因此表达式 &i1
采用 int
的地址,产生类型为 int *
的表达式。然后将此表达式分配给 p1
,它也是 int *
.
所以现在 p1
指向 i1
的内存位置,所以表达式 *p1
将是 5
.
&
运算符只是 returns 指向其操作数的指针。如果其操作数是 int
,则结果类型将为 int*
。如果其操作数是 int*
,则结果类型将为 int**
。例如这个程序:
#include <stdio.h>
struct test {
int a;
int b;
int d;
};
int main ( ) {
struct test foo = { 0, 0, 0 } ;
printf( "%lu\n", (unsigned long)(&foo + 2) - (unsigned long)&foo );
}
在我的机器上输出24,因为sizeof(struct test)
是12,而&foo
的类型已知是struct test *
,所以&foo + 2
计算的偏移量是2 struct test
s.