考试辅导:二级C语言教程第六章:指针
第6章:指针介绍
指针
指针是C语言中广泛使用的一种数据类型。指针编程是C语言最重要的风格之一。指针变量可以用来表示各种数据结构;能轻松使用数组和字符串;并且可以像汇编语言一样处理内存地址,从而编译出简洁高效的程序。指针极大地丰富了C语言的功能。学习指针是学习C语言最重要的部分。能否正确理解和使用指针是我们是否掌握C语言的标志。同时,指针也是C语言中最难的部分。除了正确理解基本概念,还需要在电脑上编程调试。只要做到这一点,指针就不难掌握。
在计算机中,所有的数据都储存在内存中。一般一个内存中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数量不一,如整数量占2个单元,字符量占1个单元等。,这在第二章已经详细介绍过了。为了正确访问这些存储单元,必须对每个存储单元进行编号。根据存储单元的编号,可以准确地找到存储单元。存储器的编号也称为地址。由于所需的存储单元可以根据其编号或地址找到,因此该地址通常被称为指针。存储单元的指针和存储单元的内容是两个不同的概念。可以用一个通俗的例子来说明它们之间的关系。我们去银行存取款,银行工作人员会根据我们的账号找我们的存款单,然后在存款单上写存取金额。这里账号是存单的指针,存款号是存单的内容。对于存储单元,单元的地址是指针,存储的数据是单元的内容。在C语言中,允许使用变量来存储指针。这个变量叫做指针变量。因此,指针变量的值是内存单元的地址或内存单元的指针。图中有一个字符变量C,其内容为“K”(ASCII码为十进制数75),C占用单元011A(地址用十六进制数表示)。有一个指针变量P,内容为011A。在这种情况下,我们称P为指向变量C的指针,或者P是指向变量C的指针,严格来说,指针是一个地址,也是一个常数。然而,一个指针变量可以被赋予不同的指针值。然而,指针变量通常简称为指针。为了避免混淆,我们约定“指针”指的是地址,地址是一个常量,“指针变量”指的是值为地址的变量。指针被定义为通过指针访问存储单元。
由于指针变量的值是一个地址,所以这个地址不仅可以是变量的地址,也可以是其他数据结构的地址。在指针变量中存储数组或函数的第一个地址有什么意义?因为数组或函数是连续存储的。通过访问指针变量获得数组或函数的第一个地址,找到数组或函数。这样,所有出现数组和函数的地方都可以用指针变量来表示,只要指针变量给出数组或函数的第一个地址。这样做会让程序的概念非常清晰,程序本身简洁高效。在C语言中,一个数据类型或数据结构经常占用一组连续的内存单元。“地址”这个概念并不能很好的描述一个数据类型或者数据结构,而“指针”其实是一个地址,但它是一个数据结构的第一个地址,它指向的是一个数据结构,所以这个概念更清晰,表达也更明确。这也是引入“指针”概念的重要原因。
指针变量的类型描述
指针变量的类型描述包括三个内容:
(1)指针类型描述,即将一个变量定义为指针变量;
(2)指针变量名;
(3)变量值(指针)指向的变量的数据类型。
它的一般形式是:类型说明符*变量名;
其中*表示这是一个指针变量,变量名称是定义的指针变量名称,类型说明符表示该指针变量所指向的变量的数据类型。
例如:int * p1P1是一个指针变量,它的值是一个整型变量的地址。或者p1指向一个整型变量。至于p1指向哪个整型变量,应该由给p1的地址决定。
再比如:
staic int * p2;/*p2是指向静态整数变量的指针变量*/
float * P3;/*p3是指向浮点变量*/
char *p4的指针变量;/*p4是指向字符变量的指针变量*/需要注意的是,指针变量只能指向同类型的变量。例如,P3只能指向浮点变量,而不能指向浮点变量和字符变量。
指针分配
指针和普通变量一样,不仅要在使用前定义,还要赋予特定的值。不能使用未赋值的指针变量,否则会造成系统混乱甚至崩溃。指针的赋值只能给地址,不能给其他任何数据,否则会出错。在C语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址。C语言中提供了地址运算符&来表示变量的地址。它的一般形式是:&变量名;比如&a代表变量A的地址,&b代表变量b的地址,变量本身必须事先指定。有指针变量P指向整型变量。如果想把整型变量A的地址赋给P,有两种方法:
(1)指针变量初始化方法int A;
int * p = & a;
(2)赋值语句的方法int a;
int * p;
p = & a;
不允许给指针变量赋值一个数,所以下面的赋值是错误的:int * p;p = 1000不能在分配的指针变量前添加“*”说明符。写* p =&a也是不对的。
指针变量的操作
指针变量可以执行一些操作,但是操作的类型是有限的。它只能执行赋值运算、部分算术运算和关系运算。
1。指针操作符
(1)取址算子&
取址算子&是一个单目算子,它的组合是从右到左的,作用是取一个变量的地址。在前面介绍的scanf函数和指针变量赋值中,我们已经知道并使用了&运算符。
(2)取内容运算符*
取内容运算符*是一个单目运算符,其组合是从右到左的,用来表示指针变量所指向的变量。*运算符后面的变量必须是指针变量。请注意,指针运算符*与指针变量描述中的指针说明符*不同。在指针变量描述中,“*”是类型说明符,表示它后面的变量是指针类型。表达式中的“*”是一个运算符,用来表示指针变量所指向的变量。
main(){
int a=5,* p = & a;
printf ("%d ",* p);
}
...
表示指针变量P获得了整型变量a的地址,该语句表示输出变量a的值。
0条评论