第十章-指针(知识点)
一、指针变量。
1、程序经过编译后已经将变量名转换为变量的地址,对变量值的存取都是通过地址进行的。
2、按变量地址存取变量值的方式称为“直接访问”方式。
3、将地址形象化的称为“指针”。
4、变量的指针就是变量的地址;存放变量地址的变量是指针变量。
指针的理解5、&:取地址运算符;*:指针运算符(“间接访问”运算符),取指针所指向的对象的内容。
6、(*pointer_1)++与*pointer_1++ <==> *(pointer_1++)不同。
7、指针变量做函数的参数。
二、数组与指针。
1、p=&a[0] <==> p=a 数组首元素的地址赋给指针变量p。
2、定义指针变量时赋初值方法:
①int *p=&a[0]; ②int *p=a ③int *p; p=&a[0]
3、通过指针引用数组元素:
(1)p+i 和 a+i 就是 a[i] 的地址;它们指向 a 数组的第 i 个元素。
(2)*(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即a[i]。
(3)指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价。
4、注意:
(1)当引用数组a[ ]时不能a++,因为数组名a代表数组首元素的地址,它是一个指针常量,它的值在程序运行期间不改变。
(2)在for循环里引用指针时,注意指向的地址,需要重新让指针回归开始指向的地址。
5、区分指针与自增自减运算符:
(1)*(p++)与*(++p)作用不同。前者先取*p,然后使p+1;后者先使p加1,在再取*p。假定p的初值为a(即&a[0]),则*(p++)为a[0],而*(++p)为a[1]。
(2)++(*p)表示p所指向的元素值加1。假如p=a,++(*p)相当于++a[0]。若a[0]=3,在用了++(*p)后a[0]+1=4。
数组a的性质6、用指向数组的指针作函数参数。
一维数组名可以作为函数参数传递,二维数组名可以作为函数参数传递。在用指针变量作形参以接受实参数组名传递来的地址时,有两种方法:①用指针变量的指针变量;②用指向一维数组的指针变量。
main中: float score[3][4]; average(*score,10); search(score,2);
void average(float *p,int n);
void search(float (*p)[4],int n);
三、例题介绍。
1、P237 例题10.7 。
10.7题目 10.7答案-形参数组 10.7答案-形参指针 10.8答案-实参指针2、P241 例题10.9。
10.9题目 10.9答案3、P249 例题10.13和例题10.14。
10.13题目 10.13答案 10.13分析(来自课本) 10.14题目 10.14答案四、字符串与指针。
1、字符数组存放一个字符串。string[i] 等价于 *(string+i)
char string[]="I love China!";
2、用字符指针指向一个字符串。
char *string="I love China!"; 等价于
char *string; string="I love China!";
将"I love China!"的第一个字符的地址赋值给指针变量string。
3、例题介绍。
(1)P252 例题10.17和例题10.18。将字符串a复制为字符串b。
10.17答案字符数组指针 10.18答案指针变量(2)P254 例题10.19。用函数调用实现字符串复制。
10.19答案字符数组作参数 10.19答案实参用字符指针变量 10.19答案形参用字符指针变量五、指向函数的指针。
格式:数据类型 (*指针变量名)(函数参数表列)
原来:
void main(){ int max(int,int); c=max(a,b); }
int max(int a,int b){ };
现在的main中:
int (*p) (int,int); p=max; c=(*p)(a,b);
1、定义的p是一个指向函数的指针变量;p两侧的括号不可省略;
p=max:将函数max的入口地址赋值给指针变量p;
c=(*p)(a,b); <==> c=max(a,b); 指针形式实现函数调用。
2、用指向函数的指针作函数参数。
3、P263 例题10.23。
10.23题目 10.23答案六、返回指针值的函数。
格式:类型名 *函数名(参数表列)
例如:int *a(int x,int y);
调用它能够得到一个指向整型数据的指针(地址)。
10.24题目 10.24答案 10.25题目 10.25答案 10.25答案分析1 10.25答案分析2七、指针数组和指向指针的指针。
1、指针数组定义:类型名 *数组名[ 数组长度 ];
例如:int *p[4] ; <==> int *(p[4]);
指针数组中的每一个元素都相当于一个指针变量。
适用于:用来指向若干个字符串,使字符串处理更加方便。
2、P269 例题10.26。
10.26题目 10.26答案3、指向指针数据的变量=指向指针的指针
char **p; <==> char *(*p);
char *p; ==>指向字符数据的指针变量。
4、指针数组作main函数的形参。
void main(int argc,char *argv[ ]);
实际上实参是和命令一起给出的,也就是在一个命令行中包括命令名和需要传给main函数的参数。
命令名 参数1 参数2 ......参数n
命令名是main所在的执行文件名。文件名包括盘符、路径以及文件的扩展名。
形参argc是指命令行中参数的个数(文件名也作为一个参数)。
形参argv是一个指向字符串的指针数组。
例如:file1 China Beijing
argc=3;argv[0](是指向字符串“file1”)的值是字符串“file1”的首地址。argv[1]指向字符串“China”。argv[2]指向字符串“Beijing”。
字符串首地址构成一个指针数组