引言
内存空间或变量的地址 - 指针
存放地址的变量(地址变量)- 指针变量
一、地址(指针)、地址变量(指针变量)概念及变量的存取方式
1、内存、内存地址 - 物理存储器的概念
2、变量、变量名、变量的地址、变量值 - 高级语言的存储器概念
3、指针、变量的指针、指针变量
4、系统访问变量的两种方式
(1) 直接访问-按变量名、按地址(本质按地址)
(2) 间接访问
二、指针变量的定义(变量先定义后使用)
1、定义格式:
类型名 *指针变量名
2、说明: (1)指针变量基类型-指针变量指向数据的类型
(2)指针变量存放地址值,本身占用空间2字节
三、指针变量的赋值(使用未赋值指针等同于向一个随机的内存中写入数据)
1、将地址直接赋值给指针变量。例如,float *f=malloc(4);(补充)
2、将变量地址赋值给指针变量。例如:float a,*p;p=&a;
四、指针变量的引用
1、&运算符(取地址运算符)
2、*运算符(指针运算符、间接访问运算符)
五、指针变量作为函数的参数
变量可以作为函数参数,指针变量同样可以作为函数参数。使用指针作为函数参数,可以在函数中对指针所指向变量的值进行处理(修改)。
指针作为函数参数,本质上同样是单向传值,但是由于传递的是地址值,所以可以通过地址值间接修改形参、实参共同指向的变量。
例:输入a,b两个数交换后输出。
在swap函数中使用两个指针作为函数参数,对两个指针所指向变量值进行交换。
结论:
1、要在被调用函数中,修改主调函数的变量值应当:
(1)将主调函数变量的地址传递给被调用函数,就是说函数应当传递的是变量的地址。
(2)被调用函数的形参应当使用指针变量接受主调函数的地址值。
(3)在被调用函数中通过形参指针变量间接访问,修改实参、形参地址所共同指向的变量。本例的操作是交换两个指针变量所指向的变量。
2、函数使用指针作为参数,可以增加主调函数与被调函数之间数据沟通的渠道。
六、指向数组的指针变量
1、指向数组的指针变量:就是指向数组元素的指针变量,也就是指向基类型的指针变量并将其初始化指向数组。
例如:数组int a[10];其中每个元素为整型变量。可以定义一个指向整型变量的指针变量int*p;并将p初始化为&a[0]或a。此时可以将p称为指向数组的指针变量。
2、数组的指针变量的定义和初始化
数组基类型 *p; p=数组名;/* p=&数组名[0] */
或:数组基类型 *p=数组名;
七、通过指针引用数组元素 (假设int a[100]; int *p=a; 即指针p指向数组)
1、指针a+i、指针变量p+i的含义。存在a[i]、是否有p[i]?-C允许p[i]!
2、指针与数组的关系。数组元素可以用下标访问,也可以用指针访问。
3、通过指针引用数组元素。
(1)数组元素的地址表示:&a[i],p+i,a+i。
(2)数组元素的访问:a[i],*(p+i),*(a+i)。
指向数组的指针变量,数组名在许多场合可以交换使用。a[i]甚至可以表示为p[i]。
注意:
(1)引用数组元素可以采用下标法和指针法。(假设p=a)
下标法:a[i],p[i];指针法:*(a+i),*(p+i)
(2)数组名是常量指针,指向数组的指针变量是变量。例10-3.P141-P142。
(3)注意:使用数组的指针变量,如果改变了其值,那么应当关注其当前指向的位置。必要时可以重置指针。
八、数组名作为函数参数(基本等价于用指向数组的指针作函数参数)
1、形参数组的数组名b接受了实参数组a的首地址-不严格。接受地址的变量是指针变量。
C编译系统将形参数组名作为数组的指针变量来处理。所以形参float b[]即:float *b。
2、数组作为函数参数,使用指针更加灵活。
注意:指针在移动。

