指针
概念:
(1)p是指针/地址 变量(是个存着地址的变量),其值是(p中存放)一个变量的地址。
p收到了(放入了)哪个变量的地址,就指向哪个变量。该变量成为p的对象。
(2)*p是p所指向的对象的值。
→*p是一个值,为指向变量的值
原则
(1)* 后面只能跟地址, *p 表示参数的值
(2)&后面只能跟变量。 &a 表示参数a的地址
(3) ’=‘ 是赋值,默认只允许同类型的参数进行赋值(若不同类也会赋值,但是执行结果会出错)
→只允许,(指针)地址 赋值 给(指针)地址
(变量)值 赋值 给(变量)值
定义
定义基类型指针 Elemtype *elem;
(Elemtype 是指针所指向单元内容的类型)
C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中
定义时赋值:int *p = &a(√) (p存放的地址初始化为&a)
相当于 int *p,p=&a;
(★★★定义即int *p时理解成基地址 需要赋值一个地址变量,而定义以后的*p是一个值,需要赋值 值)
因为指针p没有指向变量,需要先赋值一个地址
同理 int *p = a; ×
不可将值(整形变量)赋值给地址(变量)
相当于int *p;p=k;(×)
★★★赋值 &k 是地址
int *p,*q,a=20;
①*p=a; √ 给p指针指向的地址赋值
(都是值,实现将*p指向的变量值赋值为a)
②q=p;√(因为p/q都是指针,该语句实现将p的值赋值给q)
③p=q=&a;√(p/q(值)是地址,&a也是地址)
④p=*q;× p=a; ×(p是地址,*q,a是值)
⑤a=*p; *p=*q; √(都是值)
取值(结构体类型指针)
若定义一个指针指向特定数据类型变量
如elm *p=stu1;
(等同于elem *p;p=&stu1;)
则stu1.name等同于(*p).name
又等同于p→name :p所指结构体变量(结点)的name成员(值)
数组指针(数组的指针 即数组被一个指针指向,指针中存放的是数组的基地址)
当一个指针变量被初始化成数组名时,就说该指针变量指向了该数组(p中存放str的首地址)
如 char str[20], *p; p=str;
可以改变数组的字符值(可写)
指向字符型指针
char * str = "I love China!";
或 (*位置任意 只要在中间就行)
char * str; str = "I love China!";
指向的一个固定常量字符串(第一个字符的地址即字符串的首地址) 不可写仅可读
对字符型指针str做输入字符串的命令,就会将常量字符串全部输出。(打印完第一个字符会自动打印完整个字符串)
★数组指针与字符型指针区别
(1)char *p(定义一个字符型指针)
(2)①p=数组名;(将数组的地址/也就是首地址 赋值 给数组指针)
p=字符串;(将字符串的地址/也就是首字符的地址 赋值 给字符型指针)
★★★
*(p+n), p[n]都是第(i+1)个元素的值
★★★C/C++指针的不同
输出
printf(“%s”,p); →输出字符串(p指向的字符串)
printf(“%d”,p); →输出指针p值
C++
输出:
cout *p →输出字符串(指针指向的内存空间)
cout p →输出指针中存放的地址
函数指针
是指向函数的指针变量。
返回类型 (*函数指针名)(原函数参数)
赋值:函数指针名=指向函数名;
调用:函数指针名(参数);
可用该指针变量调用函数。
函数要执行的命令和普通的变量一样都是放在内存中的
既然放在内存中就会有地址
函数开始的第一条命令也不例外
而它的地址就叫函数的起始地址
现在用一个指针指向这个地址
当间接访问这个指针指向的地址所存放的命令时,这个函数就被启动了
而这个指针就叫函数指针
“函数指针”其实就是“函数的指针”
“指针函数”就是一类函数。什么类呢?是返回值是指针的函数
其实很好记忆
“xx函数”就是返回值为“xx”的函数。