指针的高级声明\指针变量的运算

  • Post author:
  • Post category:其他




指针的高级声明

int f;/*声明一个整数*/
int *f;/*声明一个指向整型的指针*/
int *f,g;/*这个并不是两个整形指针,而是一个指针,一个整型*/
int f();/*一个返回值为整型的函数*/
int *f();/*本质是一个函数,函数的返回值为指向整型的指针*/
int (*f) ();/*本质是一个指针,指针指向一个返回值为整型的函数*/
int  *(*f) ();/*本质是一个指针,指针指向返回值为指向整型的指针的函数*/
int f[];/*数组,数组元素为整型*/
int  *f[];/*数组,数组元素为指向整型号的指针*/
int  f()[];/*其实是非法的,看着像是一个函数,函数的返回值是整型号数组,因为函数只能返回标量,不能返回数组*/
int  f[]();/*其实是非法的,看着像是一个数组,数组元素类型是返回值为整型的函数,因为数组元素具有相同的长度,但不同的函数显然可能具有不同的长度*/
int  (*f[]) ();/*本质是数组,数组的元素是指针,指针指向具有整型返回值的函数*/
int  *(*f[]) ();/*本质是数组,数组的元素是指针,指针指向具有返回值为整型指针的函数*/
int  (*f)(int,float);/*是一个函数指针,指向具有返回值为整型的函数*/
int  *(*g[])(int,float);/*是一个数组,数组的元素是函数指针,指针指向的函数具有的返回值类型是指向整型的指针*/`



指针变量的运算

指针变量可以进行某些运算,但其运算的种类是有限的。 它只能进行赋值运算和部分算术运算及关系运算。



指针运算符

(1)取地址运算符&

取地址运算符&是单目运算符,其结合性为自右至左,其功能是取变量的地址。

(2)取内容运算符*

取内容运算符

是单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。在

运算符之后跟的变量必须是指针变量。

需要注意的是指针运算符

和指针变量说明中的指针说明符

不是一回事。在指针变量说明中,“

”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“

”则是一个运算符用以表示指针变量所指的变量。



指针变量赋值运算

指针变量的赋值运算有以下几种形式:

(1)指针变量初始化赋值。

(2)把一个变量的地址赋予指向相同数据类型的指针变量。例如:

int a,*pa;

pa=&a; /

把整型变量a的地址赋予整型指针变量pa

/

(3)把一个指针变量的值赋予指向相同类型变量的另一个指针变量。

(4)把数组的首地址赋予指向数组的指针变量。

(5)把字符串的首地址赋予指向字符类型的指针变量。

(6)把函数的入口地址赋予指向函数的指针变量。



其它

指针类型属于标量类型,因此也可以做逻辑与、或、非运算的操作数和if、 for、 while的控制表达式, NULL指针表示假,非NULL指针表示真。



内存与地址及指针变量和内容



内存和地址

所有的数据都是存放在存储器中的, 一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等。

为了正确地访问这些内存单元, 必须为每个内存单元编上号, 根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。 既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。



指针变量和内容

对于一个内存单元来说,单元的地址即为指针, 其中存放的数据才是该单元的内容。

在C语言中, 允许用一个变量来存放指针,这种变量称为指针变量。因此, 一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。严格地说,一个指针是一个地址, 是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。 但常把指针变量简称为指针。

定义指针的目的是为了通过指针去访问内存单元。 既然指针变量的值是一个地址, 那么这个地址不仅可以是变量的地址, 也可以是其它数据结构的地址。

在C语言中, 一种数据类型或数据结构往往都占有一组连续的内存单元。 用“地址”这个概念并不能很好地描述一种数据类型或数据结构, 而“指针”虽然实际上也是一个地址,但它却是一个数据结构的首地址, 它是“指向”一个数据结构的,因而概念更为清楚,表示更为明确。 这也是引入“指针”概念的一个重要原因。

注意:

不管是程序员还是计算机都无法通过值的位模式来判断它的类型,类型是通过值的使用方法来隐式确定的,编译器能够保证值的声明和值的使用之间的关系是恰当的,从而帮助我们确定值得类型。