- 论坛徽章:
- 0
|
>> 指针只是一个普通变量
根据不同的上下文环境,单独的“指针(Pointer)”可以指的是指针类型、指针对象、指针变量(变量是有名字的对象)、指针值中的任意一种,而不是象你说的那样仅仅指的是一个变量。
比如程序中的表达式 &q 的结果是一个指向 int 的指针。此处的“指针”指的其实是一个指针值。
>> 指针特殊就特殊在对他所存储的值的解释上和对他的使用上。
其实就是对指针类型规定的行为。
>> C语言只有一种函数参数传递方式:按值传递
站在函数参数的角度来看确实如此,只有值传递。不过,如果站在指针指向的对象的角度来看,那就是此对象的地址通过指针参数传递到了函数内,即传址。很多时候转换一下看问题的角度可以带来更大的方便性。
>> a不是const pointer to int类型的,我们是可以从下面这个事实推出来的:
>> sizeof(a)跟sizeof(int*)是不同的.
a 的定义类型是一个数组,不是指针,这是没有问题的;但是,数组对象的一个重要特点就是它的值是数组第一个元素的地址(即指向第一个元素的指针),这一点比前者更为常用。
其实,数组对象在表达式中作为数组类型还是指针类型来使用取决于其上下文环境:
- 在左值语义下是数组类型
例如 &a 以及 sizeof(a) 中的 a 都处于左值语义下,所以 a 仍然是数组类型。
- 在右值语义下是指针类型
在对 a 进行求值的情况下它转换为一个指针。例如:
int a[10];
int* p = a;
上面的 a 应该看作是指向 int 的指针(pointer to int)。如果仍然把 a 作为数组类型,在理解上会带来困难。
同时还请注意:sizeof(a) 的结果不能说明 a 在右值语义环境中的情况,因为 sizeof(a) 中的 a 始终处于左值语义环境。
>> int a[5]={1, 2, 3, 4, 5};
>> a是array of 5 ints类型的,但是a的值是什么呢?a的值存储的是一个 pointer to int
a 的值不是“存储”在数组对象中,而是来自于数组对象 a 的第一个元素的地址,是数组对象在右值语义环境下而产生的数组转换为指针的结果。 |
|