一 内存和地址
指针定义的引入
假如你的一个去旅游,然后进入酒店夜宿,而这时候你要去找他,如果你的朋友没有告诉他的房间,这时候你就要一个一个房间找,这就显得很麻烦。此时假如你的朋友告诉他的房间,这时候你就可以快速找到他所在房间,这样是不是节省了很多时间。此时我们可以把指针理解为酒店的房间号。
在C语言中地址又被称作指针
指针==内存单元编号==地址
二 指针变量和地址
1 得到一个变量的地址有几个方法呢?
第一种:取地址操作符(&)。
第二种:指针
取地址操作符(&)
2 指针变量
2.1指针变量
定义:那我们通过取地址操作符(&)拿到的地址是⼀个数值,⽐如: 0x006F356,这个数值有时候也是需要存储起来,⽅便后期再使⽤的,那我们把这样的地址值存放在哪⾥呢?答案是:指针变量中。指针变量也是⼀种变量,这种变量就是⽤来存放地址的,存放在指针变量中的值都会理解为地址。
此时我们发现pa和&a打印出来的值都是地址,说明存放在指针变量中的值都会理解为地址。
2.2指针类型
char* pa;//字符型指针
int* pa;//整型指针
float* pc;//浮点型指针
2.3如何拆解指针类型(指向与被指向关系)
int a = 10 ;int * pa = &a;
这⾥pa左边写的是 int* , * 是在说明pa是指针变量,⽽前⾯的 int 是在说明pa指向的是整型(int) 类型的对象。
指向与被指向关
int a = 10;
int* pa = &a;2.4
2.4 解引⽤操作符
上面我们说到存放在指针变量中的值都会理解为地址。那我们将地址保存起来,未来是要使⽤的,那怎么使⽤呢?这时候就要引入解引⽤操作符。
作用:在现实⽣活中,我们使⽤地址要找到⼀个房间,在房间⾥可以拿去或者存放物品。C语⾔中其实也是⼀样的,我们只要拿到了地址(指针),就可以通过地址(指针)找到地址(指针)指向的对象,而解引⽤操作符(*)就有这作用。
1 # include <stdio.h>2 int main ()3 {4 int a = 100 ;5 int * pa = &a;6 *pa = 0 ;7 return 0 ;}
2.5 指针变量的⼤⼩
指针变量的⼤⼩是不是确定的呢?答案是确定的,机器有32位机器和64位机器,32位机器有32根地址线那我们把32根地址线产⽣的2进制序列当做⼀个地址,那么⼀个地址就是32个bit位,需要4 个字节才能存储。64位机器有64根地址线假设有64根地址线,⼀个地址就是64个⼆进制位组成的⼆进制序列,存储起来就需要 8个字节的空间,指针变量的⼤⼩就是8个字节。
X64环境输出结果
X86环境输出结果
结论:(指针变量的⼤⼩和类型⽆关,只要是指针变量,在同⼀个平台下,⼤⼩都是⼀样的)
三 指针变量类型的意义
3.1指针的解引⽤
// 代码 1# include <stdio.h>int main (){int n = 0x11223344 ;int *pi = &n;*pi = 0 ;return 0 ;}// 代码 2# include <stdio.h>int main (){int n = 0x11223344 ;char *pc = ( char *)&n;*pc = 0 ;return 0 ;}
结果:调试我们可以看到,代码1会将n的4个字节全部改为0,但是代码2只是将n的第⼀个字节 改为0。
# include <stdio.h>int main (){int a = 10 ;void * pa = &a;void * pc = &a;*pa = 10 ;*pc = 0 ;return 0 ;}
这⾥我们可以看到, void* 类型的指针可以接收不同类型的地址,但是⽆法直接进⾏指针运算。
四 指针运算
1 分类:指针的基本运算有三种,分别是:
2指针+- 整数 (指针访问数组)
这里把数组首元素的地址放到指针变量p中,再通过解引用得到首元素,然后提供for循环改变p并且解引用。我们这里在给p地址时未用&这是因为在数组中等价与数组首元素地址。
3指针-指针
这里我们可以发现两个指针相减得到8
结论 两个指针一定是指向同一块区域(不能一个是int类型一个是char类型)
指针-指针得到的值的绝对值就是两个指针之间的元素个数。
4指针的关系运算(可用于判断是否越界例如与数组的最后一个元素做比较)
// 指针的关系运算# include <stdio.h>int main (){int arr[ 10 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };int *p = &arr[ 0 ];int sz = sizeof (arr)/ sizeof (arr[ 0 ]);while (p < arr + sz) // 指针的⼤⼩⽐较{printf ( "%d " , *p);p++;}return 0 ;}
本篇文章就到此结束,希望有所能帮到 读者更好的了解指针,后续还会继续更新指针相关知识。