指针笔记
- 指针变量的定义
类型名 * 指针变量名
int *p;
p 是整型指针,指向整型变量
float *fp;
fp 是浮点型指针,指向浮点型变量
char *cp;
cp 是字符型指针,指向字符型变量
int * p;
指针变量名是 p,不是*p
* 是指针声明符
int k, *p1, *p2;
等价于:
int k;
int *p1;
int *p2;
定义多个指针变量时,每一个指针变量前面都必须加上*
2.指针的基本运算
如果指针的值是某个变量的地址,通过指针就能间接访问那个变量。
取地址运算和间接访问运算
& 取地址运算符
int *p, a = 3; (指针变量的类型和它所指向变量的类型相同)
p = &a; 把 a 的地址赋给 p,即 p 指向 a
* 间接访问运算符,访问指针所指向的变量
printf("%d", *p); 输出 p 指向的变量 a 的值
3.指针变量的初始化
1) 指针变量在定义后也要先赋值再引用
2) 在定义指针变量时,可以同时对它赋初值
int a;
int *p1 = &a;
int *p2 = p1;
3) 不能用数值作为指针变量的初值,但可以将一 个指针变量初始化为一个空指针
int *p=1000;
p = 0;
p = NULL;
p = (int*)1732;
4.指针作为函数参数
函数参数包括实参和形参,两者的类型要一致,可以是指针类型
如果实参是某个变量的地址,相应的形参就是指针
在C++语言中实参和形参之间的数据传递是单向的“值传递”方式
要通过函数调用来改变主调函数中某个变量的值:
(1)在主调函数中,将该变量的地址或者指向该变量的指针作为实参
(2)在被调函数中,用指针类型形参接受该变量的地址
(3)在被调函数中,改变形参所指向变量的值
5.数组和地址间的关系
int a[100], *p;
数组名代表一个地址,它的值是数组首元素的地址(基地址)
a+i 是数组a的基地址的第i个偏移量
6.指针的算术运算和比较运算
double *p, *q;
q - p
两个相同类型的指针相减,表示它们之间相隔的存储单元的数目
p + 1 / p-1
指向下一个存储单元 / 指向上一个存储单元
其他操作都是非法的
指针相加、相乘和相除,或指针加上和减去一个浮点数
p < q
两个相同类型指针可以用关系运算符比较大小
7.数组名作为函数的参数
数组名是指针常量,相当于指针作为函数的参数
数组名做为实参,形参是指针变量(数组)
(1) 实参是数组名
(2) 形参是指针变量
可以写成数组形式
8.字符串和字符指针
字符串常量
"array"
"point"
用一对双引号括起来的字符序列
被看做一个特殊的一维字符数组,在内存中连续存放
实质上是一个指向该字符串首字符的指针常量
char sa[ ] = "array";
char *sp = "point";
字符指针-先赋值,后引用
9.常用的字符串处理函数
函数原型在 stdio.h 或 string.h 中给出
1. 字符串的输入和输出
输入字符串:scanf ( )或gets ( )
输出字符串:printf ( )或puts ( )
stdio.h
(1)scanf("%s", str)
输入参数:字符数组名,不加地址符
遇回车或空格输入结束,并自动将输入的一串字符和 '\0' 送入数组中
(2)gets(str)
遇回车输入结束,自动将输入的一串字符和 '\0' 送入数组中
输出参数可以是字符数组名或字符串常量,输出遇 '\0' 结束
10.字符串的复制、连接、比较、求字符串长度
string.h
字符串复制:strcpy (str1, str2)
字符串连接:strcat (str1, str2)
字符串比较:strcmp (str1, str2)
求字符串长度:strlen (str)