C语言赋值基础

来源:百度知道 编辑:UC知道 时间:2024/05/20 21:22:06
int a[10], *p; 下列表达式正确的是
A p=a; B p=a[0]; C *p=&a[0]; D p=&a;
答案居然是C 难道A 有错? 求高人指点

答案肯定是A

p为指针,指向的是地址

A p=a; //p指向数组a的首地址,对的
B p=a[0]; //用a[0]这个数组成员的值给p赋值,错误
C *p=&a[0]; //*p是取缔之内的数据值,所以将数组a的首地址赋值,是错误的
D p=&a; //a本身就是地址了,再取地址,错误

C只有在初始化时,才是对的,
也就是这样:
int a[10], *p=&a[0];
书上的答案是错的,相信自己

答案肯定是C啊`````A一眼看出来就是错的`````指针P就是指向a[10]的

不好意思 2楼的朋友理解有点错误!
数组名是数组的首地址,就是数组中第一个元素的地址,是常量。常量是不能出现在赋值号=左边作为左值的。因为常量不能更改。
指针是变量,是用来存储变量地址值的变量。所以A选项错了!~~这个问题的确很难懂。。这里谢谢提问者了!我也多学到了一些知识。。

2楼是对的。

楼上的,好像说反了,这里是p=a,a在等号右边。
这里有个需要注意的问题就是初始赋值和表达式
是不同的,“C只有在初始化时,才是对的,
也就是这样: int a[10], *p=&a[0]; ”

语法角度来说是(int*)p 而不是(*p)这个样子
(当然你不能在程序里这么样子写)
它相当于int* p 和 p=&a[0], *是赋值而不是取数

因为在计算机内cpu都是通过寄存器来运算的,
内存中的数据不能够直接操作,必须读入再写回,
这个过程已经不是一个单独的指令了。
c语言也是从汇编之类发展而成的,它使用指针
的一大好处就是直接地址操作效率非常高,
所以就没有出现那样的无用的语句。
我是这么理解的。

再补充完善一点:
*p=XX 之类的语句,当(*p)仍然为指针类型,
也就是说它是一个内存地址,那么就可以用。
如果(*p)是具体的数据,比如这里int*