l*u
2 楼
一般H1B是10月1号开始吧?我的怎么是11月1号,这个有问题吗
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;
}
为啥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;
}
a*a
7 楼
啧啧!!!老包就是牛啊
韩服宗师?
看好跟mma成一对。。。
【在 p**o 的大作中提到】
: http://s.163.com/11/0714/19/78URVPHC00314D0E.html
: 水嫩水嫩的呐
韩服宗师?
看好跟mma成一对。。。
【在 p**o 的大作中提到】
: http://s.163.com/11/0714/19/78URVPHC00314D0E.html
: 水嫩水嫩的呐
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
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
F*e
11 楼
!
【在 p**o 的大作中提到】
: http://s.163.com/11/0714/19/78URVPHC00314D0E.html
: 水嫩水嫩的呐
【在 p**o 的大作中提到】
: http://s.163.com/11/0714/19/78URVPHC00314D0E.html
: 水嫩水嫩的呐
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,
你知道这个问题的答案吗?
比如需要二次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,
w*t
14 楼
(╯﹏╰) 正妹这词有待商榷
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,
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了
:
: ,
数组一般的表达为 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了
:
: ,
q*m
19 楼
红茶加炼乳做奶茶
p*o
23 楼
据说已被MMA把到手了?
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,
,
【在 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,
a*t
28 楼
请问标签上就写着炼乳,还是啥英文单词?
a*u
29 楼
是很嫩啊
【在 p**o 的大作中提到】
: http://s.163.com/11/0714/19/78URVPHC00314D0E.html
: 水嫩水嫩的呐
【在 p**o 的大作中提到】
: http://s.163.com/11/0714/19/78URVPHC00314D0E.html
: 水嫩水嫩的呐
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.
我是想说他的区别关键在 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.
a*t
46 楼
好的~~
我身体好像比较虚寒,喝多了水果茶和绿茶就会浑身酸疼~~
我身体好像比较虚寒,喝多了水果茶和绿茶就会浑身酸疼~~
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
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
f*w
55 楼
apple cider, hot cocoa, eggnog, all kinds of hot tea.
s*m
58 楼
进来学习
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。
二维的下标只是用来计算转换的连续一维数组(内存)的 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。
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怎么实现没有关系。
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怎么实现没有关系。
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.
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.
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.
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.
E*P
69 楼
咖啡啊咖啡~~~
l*s
70 楼
最近天天早饭喝的饮料是镇江香醋+冬蜜。
n*n
77 楼
红糖+红薯+姜汤
相关阅读
是不是我看错了,Kaggle上可做的题一共11题? (转载)最近跟着领导学了react,的确不错wdong这个data science bowl 进前十了能拿多少钱啊?scala is leaving JVMlua里面实现点乘[bssd]教小孩计算机最难的地方...Idris是未来机器学习的一个潜在竞争者wdong开始转型娱乐业了维护一个热门视频榜单的apiJulia没戏了DeepMind: AlphaGo 携手中国顶尖棋手:共创棋妙未来Is your password safe?刚看到一个国内人做的花卉植物鉴别的app,叫“形色有谁懂这个: example(data.table) ; dt.tbl> DT[X, on=.(y<=foo)]变量就是个酱油瓶子其实税务/财务软件完全有发展空间的[bssd]改行秘籍被opengl害惨了!问wdong一个问题,学习openGL从哪儿开始学好python JIT还是没有能实用的啊