C语言地址表达式

来源:百度知道 编辑:UC知道 时间:2024/06/11 19:10:04
15.设有语句int a[4][10],*p=*a;则下列表达式中不是地址表达式的是( )
A.&a[1][2] B.a[3]
C.*(p+1*10+2) D.p+1*10+2
为什么?

C不是地址表达式
A.&a[1][2] //第2行第3列的元素地址
B.a[3] //第4行1列的元素地址
C.*(p+1*10+2) //第2行第3列的元素
D.p+1*10+2 //第2行第3列的元素地址,也就是说A和B的指的是同一元素的地址,也就是C元素的地址

这个例子可以看的非常明白
#include<stdio.h>
int main()
{
int a[4][10]={{0,1,2,3,5,6,7,8,9},
{10,11,12,13,14,15,16,17,18,19},
{20,21,22,23,24,25,26,27,28,29},
{30,31,32,33,34,35,36,37,38,39}};
int *p=*a;
printf("%d\n",&a[1][2]);
printf("%d\n",a[3]);
printf("%d\n",&a[3][0]);
printf("%d\n",*(p+1*10+2) );
printf("%d\n",a[1][2]);
printf("%d\n",p+1*10+2);
}

输出结果:
1244916
1244988
1244988
12
12
1244916

C
P指向数组的列,是一个列指针,p+1*10+2指向第0行的第12列,因为数组是按行储存的,所以也就是第1行的第2列,这是一个地址,但C对他进行了*操作,也就是取他的值,就成了一个数了

A是一个地址很显然,而B他也是一个地址,代表第3行
的首地址,相当于是一个一维数组名

C,p本来是地址,然后被括号起来取其内容,就不是地址了

B
其它都是啊

BC<