业精于勤,荒于嬉;行成于思,毁于随。
arr[0]是一个一维数组,&arr[0]是指向一维数组的指针,&arr[0]+1也是指向一维数组的指针,*(&arr[0]+1)是一维数组,数组在做右值的时候被自动转化指针,这是C语言中的解释
arr[0]
&arr[0]
&arr[0]+1
*(&arr[0]+1)
arr[0]是一个数组,&arr[0]是指向数组的指针,其实也可以理解为arr[0]的地址,只不过编译器知道它的类型,所以就叫它指针了。但是实际的内存中是没有一个地方存放&arr[0]或者说arr[0]的地址的。它不像变量b那样,b被声明了,编译器给它分配了内存空间,所以可以用取址&取到b的地址。
b
&
arr是数组,它的每个成员是一个数组int [2],每个成员的长度8个字节,arr + 1在做这个运算的时候被转换成了指向数组的指针int (*)[2],所以arr + 1的值就是数组arr的地址+8,它不光是一个地址,而且编译器知道它指向的数据的类型,这个在C语言的概念里就是指针了。所以*(arr+1)就是arr[1]了。
arr
int [2]
arr + 1
int (*)[2]
*(arr+1)
arr[1]
*(arr+1)就是表示的内存里的内容,但是呢这个内容又恰好是一个数组,数组被自动转换成了指向数组成员的指针,所以打印出来的是地址。如果是int arr1[2],那么*(arr1 + 1)就不一样了。
int arr1[2]
*(arr1 + 1)
&arr[0] 相当于 arr &arr[0] + 1 相当于 arr + 1 *(arr + 1) 相当于 arr[1] 所以还是地址
相关题目
arr[0]
是一个一维数组,&arr[0]
是指向一维数组的指针,&arr[0]+1
也是指向一维数组的指针,*(&arr[0]+1)
是一维数组,数组在做右值的时候被自动转化指针,这是C语言中的解释arr[0]
是一个数组,&arr[0]
是指向数组的指针,其实也可以理解为arr[0]
的地址,只不过编译器知道它的类型,所以就叫它指针了。但是实际的内存中是没有一个地方存放&arr[0]
或者说arr[0]
的地址的。它不像变量b
那样,b
被声明了,编译器给它分配了内存空间,所以可以用取址&
取到b
的地址。arr
是数组,它的每个成员是一个数组int [2]
,每个成员的长度8个字节,arr + 1
在做这个运算的时候被转换成了指向数组的指针int (*)[2]
,所以arr + 1
的值就是数组arr
的地址+8,它不光是一个地址,而且编译器知道它指向的数据的类型,这个在C语言的概念里就是指针了。所以*(arr+1)
就是arr[1]
了。*(arr+1)
就是表示的内存里的内容,但是呢这个内容又恰好是一个数组,数组被自动转换成了指向数组成员的指针,所以打印出来的是地址。如果是int arr1[2]
,那么*(arr1 + 1)
就不一样了。相关题目