关于指针的入门

  • Post author:
  • Post category:其他



目录


部分操作符优先级


指针中的取地址&和解引用*


指针运算、数组和指针的关系


附加:如何用函数交换数据的值?


部分操作符优先级


先上一张图,了解指针中的*的优先级


*(解引用操作)处于第二优先级


理解指针:


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接收


如何进行交换即可。



版权声明:本文为nyxdsb原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。