数据结构-指针

指针

‌概念:

(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”的函数。

发布了46 篇原创文章 · 获赞 15 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41850194/article/details/91873147