指针是C语言最重要的概念之一,用于存储变量的地址。前面使用的scanf函数就是用地址作为参数。像前面提到的,如果主调函数不使用return语句返回值,就要使用地址才能修改主调函数中的值。
1.一元取址运算符&
&运算符给出变量的存储地址。假设vary是变量名,&vary就是变量的地址(PC地址通常用十六进制形式表示),像printf("%d %p\n", vary, &vary);
,%p格式打印地址。
2.指针
前面说过,当被调函数要返回多个值时,需要使用指针。那么什么是指针,从根本上来说,指针是一个值为内存地址的变量(或数据对象)。像数据与C中提到的,char类型变量的值是字符等,指针变量的值是地址。
对于语句ptr = &vary;
,我们说ptr指向vary。ptr和&vary的区别就是ptr是指针变量,而&vary是地址常量,用前面提到过的内容,ptr是可修改的左值,而&vary是右值。要创建指针变量就要先声明指针变量的类型。
3.间接运算符*
间接运算符*也是也被称为解运算符,如果ptr指向vary,那么val = *ptr;
就表示将vary的值复制给val变量。
4。声明指针
声明指针变量时必须必须指定指针所指变量的类型,因为不同的变量类型占用不同的内存空间,一些指针操作要求知道操作对象的大小,另外,程序也必须知道指定地址上的数据类型。像int *ptr;
,类型说明符int表明了指针所指向对象的类型,运算符*表明声明的变量是一个指针。
我们编写程序时,可以认为变量有两个属性:名称和值(还有类型等属性)。计算机编译和加载程序后,认为变量也有两个属性:地址和值,地址就相当于在计算机内部的名称,让计算机能够找到每个变量。简而言之,普通变量把值作为基本量,把地址作为通过&运算符获得的派生量,而指针变量把地址作为基本量,把值作为通过*运算符获得的派生量。