avatar
l*u
2
一般H1B是10月1号开始吧?我的怎么是11月1号,这个有问题吗
avatar
m*a
4
二位矩阵array,比如multi[5][10]
为啥multi,*multi,&multi的地址都是一样的?
看下面的程序的运行结果
&multi is 0028FE58
multi is 0028FE58
*multi is 0028FE58
**multi is 67
&multi[0] is 0028FE58
multi[0] is 0028FE58
&multi[0][0] is 0028FE58
multi[0][0] is 67
#include
int main(void){
int multi[5][10]; /*define a two dimensional 5x10 array with a name multi*/
multi[0][0]=67; /*assign 67 to the first element of array*/
printf("&multi is %pn",&multi);
printf("multi is %pn",multi);
printf("*multi is %pn",*multi);
printf("**multi is %dn",**multi);
printf("&multi[0] is %pn",&multi[0]);
printf("multi[0] is %pn",multi[0]);
printf("&multi[0][0] is %pn",&multi[0][0]);
printf("multi[0][0] is %dn",multi[0][0]);
return 0;
}
avatar
s*e
5
好贴,但是俺不喜欢热巧克力太后了。

【在 a*******t 的大作中提到】
: 简单做的,比如热巧克力~~
avatar
S*I
6
no problem, but you have to wait until 11/1 to start work.

【在 l****u 的大作中提到】
: 一般H1B是10月1号开始吧?我的怎么是11月1号,这个有问题吗
avatar
d*i
8
This can be a bit confusing. In C, multi-dimensional array is stored in
contiguous memory. So c[i][j]=*(*(c+i)+j). For each line, see my comment
below:
#include
int main(void){
int multi[5][10]; /*define a two dimensional 5x10 array with a name multi*/
multi[0][0]=67; /*assign 67 to the first element of array*/
printf("&multi is %pn",&multi); //address of the array
printf("multi is %pn",multi); //same as above
printf("*multi is %pn",*multi); //address of the first row of the array,
which is the same as the address of the array
printf("**multi is %dn",**multi); //the first element
printf("&multi[0] is %pn",&multi[0]); //the address of the first row,
which is the same as multi
printf("multi[0] is %pn",multi[0]); //same as above
printf("&multi[0][0] is %pn",&multi[0][0]); //The address of the first
element, which is the same as address of the array
printf("multi[0][0] is %dn",multi[0][0]); //first element
return 0;
}

【在 m*********a 的大作中提到】
: 二位矩阵array,比如multi[5][10]
: 为啥multi,*multi,&multi的地址都是一样的?
: 看下面的程序的运行结果
: &multi is 0028FE58
: multi is 0028FE58
: *multi is 0028FE58
: **multi is 67
: &multi[0] is 0028FE58
: multi[0] is 0028FE58
: &multi[0][0] is 0028FE58

avatar
s*n
9
姜蜜水
生姜+蜜枣

【在 a*******t 的大作中提到】
: 简单做的,比如热巧克力~~
avatar
l*u
10
thanks for explaining

【在 S**I 的大作中提到】
: no problem, but you have to wait until 11/1 to start work.
avatar
m*a
12
多谢回答
你知道这个问题的答案吗?
比如需要二次deference **multi才会给出67
但是如果你定义一个指针 int *ptr;
ptr=multi;
*ptr就等于67了

,

【在 d****i 的大作中提到】
: This can be a bit confusing. In C, multi-dimensional array is stored in
: contiguous memory. So c[i][j]=*(*(c+i)+j). For each line, see my comment
: below:
: #include
: int main(void){
: int multi[5][10]; /*define a two dimensional 5x10 array with a name multi*/
: multi[0][0]=67; /*assign 67 to the first element of array*/
: printf("&multi is %pn",&multi); //address of the array
: printf("multi is %pn",multi); //same as above
: printf("*multi is %pn",*multi); //address of the first row of the array,

avatar
e*s
13
在国内时冬天很爱喝柚子茶
很爽口又败火

【在 a*******t 的大作中提到】
: 简单做的,比如热巧克力~~
avatar
w*t
14
(╯﹏╰) 正妹这词有待商榷
avatar
S*A
15

这个说法其实要是不懂 C array 指针的地址退化规则理解会更加混乱。
看了你的解释事乎访问 c[i][j] 要 de-reference 变量 c 两次。
其实没有。这里只有一个 load.
c[i][j] 等价于 *(base_addr + i*ARRAY_SIZE(c[0]) + j), 其中 ARRAY_SIZE
是 constant. base_addr 是数组 C 的地址。
,

【在 d****i 的大作中提到】
: This can be a bit confusing. In C, multi-dimensional array is stored in
: contiguous memory. So c[i][j]=*(*(c+i)+j). For each line, see my comment
: below:
: #include
: int main(void){
: int multi[5][10]; /*define a two dimensional 5x10 array with a name multi*/
: multi[0][0]=67; /*assign 67 to the first element of array*/
: printf("&multi is %pn",&multi); //address of the array
: printf("multi is %pn",multi); //same as above
: printf("*multi is %pn",*multi); //address of the first row of the array,

avatar
l*l
16
韩国店的柚子蜜茶很好喝。

【在 a*******t 的大作中提到】
: 简单做的,比如热巧克力~~
avatar
a*a
17
这妹子没怎么化妆就能看了,稍微再长几年,好好收拾一下
绝对秒杀北美女F1

【在 w**t 的大作中提到】
: (╯﹏╰) 正妹这词有待商榷
avatar
S*A
18
你需要知道,& 取地址是有特例的, 那就是数组和函数指针。
数组一般的表达为 a[sub_script]. 函数是 func(..)
如果没有后面的 【】 ,数组自动退化为数组的指针。
a 是 &a[0] 的简化写法, 这是一个隐含规则,当 a 后面没有【】的
时候触发。
*multi = multi[0] ,这是一个一维数组。Type 是 basetype[len_of_y]
所以 **multi = *(multi【0】)=multi【0】【0】

【在 m*********a 的大作中提到】
: 多谢回答
: 你知道这个问题的答案吗?
: 比如需要二次deference **multi才会给出67
: 但是如果你定义一个指针 int *ptr;
: ptr=multi;
: *ptr就等于67了
:
: ,

avatar
q*m
19
红茶加炼乳做奶茶
avatar
d*d
20
说不定已经收拾完了才是这样子。。。

【在 a***a 的大作中提到】
: 这妹子没怎么化妆就能看了,稍微再长几年,好好收拾一下
: 绝对秒杀北美女F1

avatar
S*A
21
你这个例子里面区别是退化后的 C type
ptr 的 C type 是 int *
mutli 的 C type 是 int [][]
multi[0] 的 C type 是 int 【】,等价于 int *。

【在 m*********a 的大作中提到】
: 多谢回答
: 你知道这个问题的答案吗?
: 比如需要二次deference **multi才会给出67
: 但是如果你定义一个指针 int *ptr;
: ptr=multi;
: *ptr就等于67了
:
: ,

avatar
a*t
22

炼乳在哪里买的阿?

【在 q****m 的大作中提到】
: 红茶加炼乳做奶茶
avatar
p*o
23
据说已被MMA把到手了?
avatar
z*n
24
不是memory order的问题 是arrays 和 pointers的区别问题

,

【在 d****i 的大作中提到】
: This can be a bit confusing. In C, multi-dimensional array is stored in
: contiguous memory. So c[i][j]=*(*(c+i)+j). For each line, see my comment
: below:
: #include
: int main(void){
: int multi[5][10]; /*define a two dimensional 5x10 array with a name multi*/
: multi[0][0]=67; /*assign 67 to the first element of array*/
: printf("&multi is %pn",&multi); //address of the array
: printf("multi is %pn",multi); //same as above
: printf("*multi is %pn",*multi); //address of the first row of the array,

avatar
s*5
25
上个星期刚买了一罐呢,中国店里一般都有滴。美国店里也有类似的吧。

【在 a*******t 的大作中提到】
:
: 炼乳在哪里买的阿?

avatar
a*a
26
操!!!!

【在 p**o 的大作中提到】
: 据说已被MMA把到手了?
avatar
t*t
27
actually, array is NOT equivalent to pointer. array will decay to pointer wh
en use in expression, with certain exceptions.

【在 S*A 的大作中提到】
: 你这个例子里面区别是退化后的 C type
: ptr 的 C type 是 int *
: mutli 的 C type 是 int [][]
: multi[0] 的 C type 是 int 【】,等价于 int *。

avatar
a*t
28
请问标签上就写着炼乳,还是啥英文单词?
avatar
z*n
30
英语的好处就是术语 中文有时候你不知道在说什么 cfaq是不是就好理解的解释

wh

【在 t****t 的大作中提到】
: actually, array is NOT equivalent to pointer. array will decay to pointer wh
: en use in expression, with certain exceptions.

avatar
y*e
31
mm怎么兑的?
我家都是兑上ikea的 raspberry 茶一起喝

【在 l*****l 的大作中提到】
: 韩国店的柚子蜜茶很好喝。
avatar
a*u
32
眼睛已经开过刀了。。。
照片看的出。。。。

【在 a***a 的大作中提到】
: 这妹子没怎么化妆就能看了,稍微再长几年,好好收拾一下
: 绝对秒杀北美女F1

avatar
S*A
33
对,这是比较正式的一点说法。
我是想说他的区别关键在 C type 上面的结果。
你说说 array in expression 还有什么特别 exceptions?
前面有 &, sizeof (array), typeof(array)?
array 到了编译器后端就全部变成 pointer 统一起来
了。这 array vs pointer 对生成代码没有什么区别。

wh

【在 t****t 的大作中提到】
: actually, array is NOT equivalent to pointer. array will decay to pointer wh
: en use in expression, with certain exceptions.

avatar
y*e
34
哪一种蜜枣?

【在 s*****n 的大作中提到】
: 姜蜜水
: 生姜+蜜枣

avatar
s*y
35
估计还是没有aozu妹妹嫩!

【在 a**u 的大作中提到】
: 是很嫩啊
avatar
m*a
36
讨论这么热烈。我还是只能说array不是指针来理解。
他有自己的规则, **multi对于array不是deference二次
但是对于指针**ptr就是,deference二次。
是不?

wh

【在 t****t 的大作中提到】
: actually, array is NOT equivalent to pointer. array will decay to pointer wh
: en use in expression, with certain exceptions.

avatar
y*e
37
绿茶(水果茶)+蜂蜜+牛奶

【在 a*******t 的大作中提到】
: 简单做的,比如热巧克力~~
avatar
F*e
38
...你还是这么yd

【在 s****y 的大作中提到】
: 估计还是没有aozu妹妹嫩!
avatar
d*i
39
对,你这个解释更好,我那个等于实际上是对于指向指针的指针来说的,实际上对于
array来说只有derefenrece一次。

【在 S*A 的大作中提到】
: 对,这是比较正式的一点说法。
: 我是想说他的区别关键在 C type 上面的结果。
: 你说说 array in expression 还有什么特别 exceptions?
: 前面有 &, sizeof (array), typeof(array)?
: array 到了编译器后端就全部变成 pointer 统一起来
: 了。这 array vs pointer 对生成代码没有什么区别。
:
: wh

avatar
b*x
40
酒酿冲蛋

【在 a*******t 的大作中提到】
: 简单做的,比如热巧克力~~
avatar
s*y
41
有嘛有嘛

【在 F********e 的大作中提到】
: ...你还是这么yd
avatar
z*n
42
哪个编译器

【在 S*A 的大作中提到】
: 对,这是比较正式的一点说法。
: 我是想说他的区别关键在 C type 上面的结果。
: 你说说 array in expression 还有什么特别 exceptions?
: 前面有 &, sizeof (array), typeof(array)?
: array 到了编译器后端就全部变成 pointer 统一起来
: 了。这 array vs pointer 对生成代码没有什么区别。
:
: wh

avatar
c*e
43
Condensed milk. Grocery store都会有的。

【在 a*******t 的大作中提到】
: 请问标签上就写着炼乳,还是啥英文单词?
avatar
a*a
44
好嗲。。。

【在 s****y 的大作中提到】
: 有嘛有嘛
avatar
m*a
45
c[i][j] 等价于 *(base_addr + i*ARRAY_SIZE(c[0]) + j),这个是对的
这个base_addr 是 *multi 或 multi[0],不是multi

【在 d****i 的大作中提到】
: 对,你这个解释更好,我那个等于实际上是对于指向指针的指针来说的,实际上对于
: array来说只有derefenrece一次。

avatar
a*t
46
好的~~
我身体好像比较虚寒,喝多了水果茶和绿茶就会浑身酸疼~~
avatar
F*e
47
现在都说' 有木有' 你out了

【在 s****y 的大作中提到】
: 有嘛有嘛
avatar
t*t
48
"The exceptions are when the array is the operand of a sizeof or & operator,
or is a string literal initializer for a character array."
C FAQ

【在 S*A 的大作中提到】
: 对,这是比较正式的一点说法。
: 我是想说他的区别关键在 C type 上面的结果。
: 你说说 array in expression 还有什么特别 exceptions?
: 前面有 &, sizeof (array), typeof(array)?
: array 到了编译器后端就全部变成 pointer 统一起来
: 了。这 array vs pointer 对生成代码没有什么区别。
:
: wh

avatar
xt
49
羊肉汤

【在 a*******t 的大作中提到】
: 简单做的,比如热巧克力~~
avatar
a*a
50
你要脑中泛起snowdy那眯缝的眼睛。。。

【在 F********e 的大作中提到】
: 现在都说' 有木有' 你out了
avatar
S*A
51
嗯,和我想的差不多。我漏掉了 literal string initializer
FAQ 漏掉了 typeof。

operator,

【在 t****t 的大作中提到】
: "The exceptions are when the array is the operand of a sizeof or & operator,
: or is a string literal initializer for a character array."
: C FAQ

avatar
Z*R
52
小米粥,玉米糊。。。

【在 a*******t 的大作中提到】
: 简单做的,比如热巧克力~~
avatar
k*w
53
金童玉女啊

【在 p**o 的大作中提到】
: 据说已被MMA把到手了?
avatar
t*t
54
typeof is not part of standard C.

【在 S*A 的大作中提到】
: 嗯,和我想的差不多。我漏掉了 literal string initializer
: FAQ 漏掉了 typeof。
:
: operator,

avatar
f*w
55
apple cider, hot cocoa, eggnog, all kinds of hot tea.
avatar
K*a
56
。。。。。。赞

【在 a***a 的大作中提到】
: 这妹子没怎么化妆就能看了,稍微再长几年,好好收拾一下
: 绝对秒杀北美女F1

avatar
f*n
57
关于 **multi,是multi(int[5][10]),decay成指针(int (*)[10]),跟着
dereference(结果int[10]),再decay成指针(int *),跟着再dereference(结果
int)。所以**multi的确是有两次dereference,只不过再加上两次decay。

【在 m*********a 的大作中提到】
: 讨论这么热烈。我还是只能说array不是指针来理解。
: 他有自己的规则, **multi对于array不是deference二次
: 但是对于指针**ptr就是,deference二次。
: 是不?
:
: wh

avatar
s*m
58
进来学习
avatar
S*A
59
你这个理解不对。只有一次 dereference。
二维的下标只是用来计算转换的连续一维数组(内存)的 offset。
下标的 offset 计算本身不是 dereference.
我给你这个示范程序,注意看这里面的 array assign.
只用了一个 dereference。
======================
int a[5][6];
void foo(void)
{
a[1][2] = 1;
**a = 2;
}
======================
$ gcc -S -O2 multi.c
.file "multi.c"
.text
.p2align 4,,15
.globl foo
.type foo, @function
foo:
.LFB0:
.cfi_startproc
movl $1, a+32(%rip) // 这里是 a[1][2] = 1
movl $2, a(%rip) // 这里是 **a = 2
ret
.cfi_endproc
.LFE0:
.size foo, .-foo
.comm a,120,32
.ident "GCC: (GNU) 4.8.2 20131212 (Red Hat 4.8.2-7)"
.section .note.GNU-stack,"",@progbits

【在 f*******n 的大作中提到】
: 关于 **multi,是multi(int[5][10]),decay成指针(int (*)[10]),跟着
: dereference(结果int[10]),再decay成指针(int *),跟着再dereference(结果
: int)。所以**multi的确是有两次dereference,只不过再加上两次decay。

avatar
f*y
60
submarino:黑巧克力扔到热牛奶里搅和

【在 a*******t 的大作中提到】
: 简单做的,比如热巧克力~~
avatar
f*n
61
我的理解完全对。我是说语义。跟compiler怎么实现没有关系。

【在 S*A 的大作中提到】
: 你这个理解不对。只有一次 dereference。
: 二维的下标只是用来计算转换的连续一维数组(内存)的 offset。
: 下标的 offset 计算本身不是 dereference.
: 我给你这个示范程序,注意看这里面的 array assign.
: 只用了一个 dereference。
: ======================
: int a[5][6];
: void foo(void)
: {
: a[1][2] = 1;

avatar
s*e
62
那就姜枣

【在 a*******t 的大作中提到】
: 好的~~
: 我身体好像比较虚寒,喝多了水果茶和绿茶就会浑身酸疼~~

avatar
S*A
63
Dereference means accessing the memory variable by the pointer
address. In other words, dereference meaning memory load or
store using pointer.
int multi[4][5];
multi【0】 as expression can decay to a pointer. That itself
is not an deference. Just like
int array[5];
expression "array" by itself is not a dereference.
It is just a pointer.

【在 f*******n 的大作中提到】
: 我的理解完全对。我是说语义。跟compiler怎么实现没有关系。
avatar
m*o
64
奶茶
红茶包加牛奶加水煮开,最后加蜂蜜就行

【在 a*******t 的大作中提到】
: 简单做的,比如热巧克力~~
avatar
f*n
65
No. Dereference means the * operator, which takes a "pointer to T"
expression and evaluates to a "T" expression.
And arrays and pointers are very different things.

【在 S*A 的大作中提到】
: Dereference means accessing the memory variable by the pointer
: address. In other words, dereference meaning memory load or
: store using pointer.
: int multi[4][5];
: multi【0】 as expression can decay to a pointer. That itself
: is not an deference. Just like
: int array[5];
: expression "array" by itself is not a dereference.
: It is just a pointer.

avatar
s*l
66
condensed milk

【在 a*******t 的大作中提到】
: 请问标签上就写着炼乳,还是啥英文单词?
avatar
S*A
67
Where is your definition come from? Any link?
The stander C definition does not have definition for "dereference".
The closest one I can find about the memory reference is at:
http://cplus.about.com/od/glossar1/g/dereference.htm
You said array and pointer are very different thing.
At the same time you are using pointer operation to explain
array dereference.

【在 f*******n 的大作中提到】
: No. Dereference means the * operator, which takes a "pointer to T"
: expression and evaluates to a "T" expression.
: And arrays and pointers are very different things.

avatar
e*e
68
姜汁可乐

【在 a*******t 的大作中提到】
: 简单做的,比如热巧克力~~
avatar
E*P
69
咖啡啊咖啡~~~
avatar
l*s
70
最近天天早饭喝的饮料是镇江香醋+冬蜜。
avatar
n*g
71
头一回听说镇江香醋能当饮料的。。冬蜜又是啥?

【在 l*********s 的大作中提到】
: 最近天天早饭喝的饮料是镇江香醋+冬蜜。
avatar
s*e
72
醋喝多了上火,尤其是秋天

【在 l*********s 的大作中提到】
: 最近天天早饭喝的饮料是镇江香醋+冬蜜。
avatar
p*a
73
热奶茶~红茶+牛奶就成~~

【在 a*******t 的大作中提到】
: 简单做的,比如热巧克力~~
avatar
l*s
74
这个很好
我也在喝

【在 s*****n 的大作中提到】
: 姜蜜水
: 生姜+蜜枣

avatar
c*l
75
这个我喜欢。不过我都不是自己做的。
买了袋装奶茶。泡来喝,很方便。

【在 q****m 的大作中提到】
: 红茶加炼乳做奶茶
avatar
l*s
76
就是蜂蜜。标签上写着冬蜜,我猜是冬天出的蜂蜜?

【在 n*****g 的大作中提到】
: 头一回听说镇江香醋能当饮料的。。冬蜜又是啥?
avatar
n*n
77
红糖+红薯+姜汤
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。