目录
部分操作符优先级
先上一张图,了解指针中的*的优先级
*(解引用操作)处于第二优先级
理解指针:
1. 指针是内存中一个最小单元的编号,也就是地址
2.平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量3.指针是一种特殊的变量类型,它指向内存中的一块地址
先来看一些指针相关的变量的简单类型(函数指针以及二级指针目前暂不涉及)
指针中的取地址&和解引用*
数据在内存中以二进制形式存入一块空间中,&操作是将这块空间的地址取出来。
而指针指向的就是一块地址,所以将这块空间的地址存入指针中
我们再讨论一下:指针的类型
我们都知道,变量有不同的类型,整形,浮点型等。那指针有没有类型呢?
准确来说:是有的。
当有这样的代码:int a =10;
pa = &a;
要将&a(a的地址)保存到pa中,我们知道pa就是一个指针变量,那它的类型是怎样的呢?答案是int *
这里可以看到,指针的定义方式是: type + * 。比如:
char * ch = NULL;
float * pf = NULL;
其实:
char* 类型的指针是为了存放 char 类型变量的地址。
float* 类型的指针是为了存放 float 类型变量的地址。
int* 类型的指针是为了存放 int 类型变量的地址。
指针运算、数组和指针的关系
一、指针+-整数
指针加减整数就是对地址进行操作,把指向的地址往后移动。
这里可以把指针比作“箭头”来理解
图示:>
定义int p =10;此时在内存中开辟了一块空间存放p
pa是指向p的指针,所以pa指向p的地址
如果让pa++呢?
则往后移动一格。
但是,一格有多大呢?
答:取决于你的数据类型
数据类型
char 字符数据类型1字节
short 2字节
int 4字节
long 4字节
long long 8字节
float 占4字节
double 占8字节图示:>
解析:
一般情况下:数组名是数组首元素的地址(数组名就是一个指针)
两种特殊情况:sizeof(数组名)和&数组名(本文后面再说)
pa指向arr首地址(也就是数组中的第一个元素1)
由图中左下角可以看出pb和pa间相差4,为什么呢?
因为int类型占四个字节,往后移动一次,地址值就加4。
c1指向str的首地址(也就是dog的第一个字符'd')
c2指向第2个字符'o'
为什么c1和c2只差1呢?
因为char类型占一个字节,往后移动一次,地址值加1。
数组和指针可以相互表示:
int arr[3] = {1,2,3};
int *pa = arr;
那么*(pa+i)和arr[i]就是等价的
附加:如何用函数交换数据的值?
指针指向地址,到底什么意思?
此时你发现并没有交换成功,为什么?
我们进入监视窗口看一看:>
由下图可知:
x和y确实交换成功了,但是a和b并没有进行交换。
因为在swap函数中,我们只是把a和b的值赋给了x和y,然后让x和y进行交换。
那么,如何让a和b交换呢?用指针!!
交换a和b值,只需要把a和b的地址传过去,交换a和b的地址。
解析:>
由于传入的是x和y的地址,所以函数中用int *类型的x和y接收
如何进行交换即可。