avatar
b*m
1
碰到以下面试题,不知怎样回答, 请教高手,Thanks in advance
Describe a use for the following macro: #define X(y, z) ((int) &(((y *) 0)-
>z))
avatar
T*i
2
月经题
to get the offset of the member z within a struct/class y

)-

【在 b***m 的大作中提到】
: 碰到以下面试题,不知怎样回答, 请教高手,Thanks in advance
: Describe a use for the following macro: #define X(y, z) ((int) &(((y *) 0)-
: >z))

avatar
P*e
3
这个y *是什么意思

【在 T*******i 的大作中提到】
: 月经题
: to get the offset of the member z within a struct/class y
:
: )-

avatar
c*t
4
weak, pointer cast.

【在 P********e 的大作中提到】
: 这个y *是什么意思
avatar
T*i
5
ft,你也是个老警察了吧

【在 P********e 的大作中提到】
: 这个y *是什么意思
avatar
g*s
6
trick在((y*) 0),不在(y*)本身吧。
class A{
};
A *x=0;
A *y=(A*) 0;
Here x!=y?
月经对初潮的也是新鲜事,哈哈。

【在 T*******i 的大作中提到】
: ft,你也是个老警察了吧
avatar
M*m
7
do you mind explaining what does that mean to assign 0 to a pointer? does
that mean it will point to memory location 0?

【在 g*********s 的大作中提到】
: trick在((y*) 0),不在(y*)本身吧。
: class A{
: };
: A *x=0;
: A *y=(A*) 0;
: Here x!=y?
: 月经对初潮的也是新鲜事,哈哈。

avatar
t*t
8
Of course x==y. what are you talking about!

【在 g*********s 的大作中提到】
: trick在((y*) 0),不在(y*)本身吧。
: class A{
: };
: A *x=0;
: A *y=(A*) 0;
: Here x!=y?
: 月经对初潮的也是新鲜事,哈哈。

avatar
t*t
9
0 cast to any pointer type returns null pointer. null pointer is null
pointer, it doesn't point to anything.

【在 M*m 的大作中提到】
: do you mind explaining what does that mean to assign 0 to a pointer? does
: that mean it will point to memory location 0?

avatar
M*m
10
I am confused by (A *)0 -> B,
#include
#define X(y, z)((int)&(((y*)0)->z))
#define X1(y, z)((int)&(((y*)1)->z))
#define X2(y, z)((int)&(((y*)2)->z))
struct A{
int AA;
int AB;
int AC;
};
int main(){
printf("%d %d %d\n", X(A,AC), X1(A,AC), X2(A,AC));
}
the result is 8, 9, 10.

【在 t****t 的大作中提到】
: 0 cast to any pointer type returns null pointer. null pointer is null
: pointer, it doesn't point to anything.

avatar
T*i
11
X(y, z)返回的是y struct/class中member z的绝对地址。
只有object指针指向0的时候才能得到相对地址即offset

【在 M*m 的大作中提到】
: I am confused by (A *)0 -> B,
: #include
: #define X(y, z)((int)&(((y*)0)->z))
: #define X1(y, z)((int)&(((y*)1)->z))
: #define X2(y, z)((int)&(((y*)2)->z))
: struct A{
: int AA;
: int AB;
: int AC;
: };

avatar
M*m
12
then why
#define X1(y, z)((int)&(((y*)1)->z))
returns 9?

【在 T*******i 的大作中提到】
: X(y, z)返回的是y struct/class中member z的绝对地址。
: 只有object指针指向0的时候才能得到相对地址即offset

avatar
k*f
13
1+2*sizeof(int)=9

【在 M*m 的大作中提到】
: then why
: #define X1(y, z)((int)&(((y*)1)->z))
: returns 9?

avatar
T*i
14
啥叫绝对地址?

【在 M*m 的大作中提到】
: then why
: #define X1(y, z)((int)&(((y*)1)->z))
: returns 9?

avatar
M*m
15
It's the memory address.
I am wondering what happened when we replace 0 by 1 and 2. // very weak.
0 is cast to NULL, what about 1 and 2?

【在 T*******i 的大作中提到】
: 啥叫绝对地址?
avatar
T*i
16
那不就结了。
一和二呀。null就是零呀。

【在 M*m 的大作中提到】
: It's the memory address.
: I am wondering what happened when we replace 0 by 1 and 2. // very weak.
: 0 is cast to NULL, what about 1 and 2?

avatar
M*m
17
Hmm, still confusing...
what does NULL mean exactly? as most book says a pointer is a variables that
stores the address. so if we say struct A* p=0, that means variable p
stores value 0, therefore points to
memory address 0. If this is true, it same reasonable to get 9 when we store
1 to p.
As it seems to me that NULL pointer points to no where. But when we cast 1
or 2, p would point to somewhere in memory - address 1 or 2, is that correct?

【在 T*******i 的大作中提到】
: 那不就结了。
: 一和二呀。null就是零呀。

avatar
T*i
18
重复一遍,null就是零。
查看cstddef (in c++)/stddef.h (in c)

that
store
correct?

【在 M*m 的大作中提到】
: Hmm, still confusing...
: what does NULL mean exactly? as most book says a pointer is a variables that
: stores the address. so if we say struct A* p=0, that means variable p
: stores value 0, therefore points to
: memory address 0. If this is true, it same reasonable to get 9 when we store
: 1 to p.
: As it seems to me that NULL pointer points to no where. But when we cast 1
: or 2, p would point to somewhere in memory - address 1 or 2, is that correct?

avatar
g*s
19
我想大多数人对NULL的理解就是NULL表示不指向任何有效对象。但即使不指向有效对象,依然可以进行->和&操作。这是个盲点。a->x就是*(a+offset(x)),&(a->x)就是a+offset(x)。a==0时,自然就是offset(x)。
不过这个“null就是0”的说法看怎么理解了。我也可以说不是一回事,因为类型不一样。我不认为(!p)是一种好的风格。

【在 T*******i 的大作中提到】
: 重复一遍,null就是零。
: 查看cstddef (in c++)/stddef.h (in c)
:
: that
: store
: correct?

avatar
p*g
20
Weak! #define NULL ((void*) 0)
> 不过这个“null就是0”的说法看怎么理解了。我也可以说不是一回事,因为类型不
一样。我不认为(!p)是一种好的风格。
avatar
t*t
21
actually, in c++, you can't do that, since void* can't be casted to T*.
so in c++, it's simply
#define NULL 0
in fact, this is what linux do:
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif

【在 p**********g 的大作中提到】
: Weak! #define NULL ((void*) 0)
: > 不过这个“null就是0”的说法看怎么理解了。我也可以说不是一回事,因为类型不
: 一样。我不认为(!p)是一种好的风格。

avatar
g*s
22
Wherever NULL appears, it refers a pointer typed symbol, no matter how it is
implemented. Actually, I prefer "const void* NULL(0);", if possible.

【在 p**********g 的大作中提到】
: Weak! #define NULL ((void*) 0)
: > 不过这个“null就是0”的说法看怎么理解了。我也可以说不是一回事,因为类型不
: 一样。我不认为(!p)是一种好的风格。

avatar
t*t
23
current c++ is a bit messy in this point. i heard c++0x is proposing a new
keyword "nullptr" for null pointer and pointer type.

is

【在 g*********s 的大作中提到】
: Wherever NULL appears, it refers a pointer typed symbol, no matter how it is
: implemented. Actually, I prefer "const void* NULL(0);", if possible.

avatar
b*e
24
不完全对. NULL确实不指向有效对象, 所以 *NULL 一定会出错.
但是这道题里, &(0->x) 并没有做 *0 操作, 直接变成 0 + offset(x),
应该是编译器干的.

象,依然可以进行->和&操作。这是个盲点。a->x就是*(a+offset(x)),&(a->x)就是a+
offset(x)。a==0时,自然就是offset(x)。
一样。我不认为(!p)是一种好的风格。

【在 g*********s 的大作中提到】
: 我想大多数人对NULL的理解就是NULL表示不指向任何有效对象。但即使不指向有效对象,依然可以进行->和&操作。这是个盲点。a->x就是*(a+offset(x)),&(a->x)就是a+offset(x)。a==0时,自然就是offset(x)。
: 不过这个“null就是0”的说法看怎么理解了。我也可以说不是一回事,因为类型不一样。我不认为(!p)是一种好的风格。

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。