Hello大家好! 很高兴与大家见面! 给生活添点快乐,开始今天的编程之路。
指针定义的引入
假如你的一个去旅游,然后进入酒店夜宿,而这时候你要去找他,如果你的朋友没有告诉他的房间,这时候你就要一个一个房间找,这就显得很麻烦。此时假如你的朋友告诉他的房间,这时候你就可以快速找到他所在房间,这样是不是节省了很多时间。此时我们可以把指针理解为酒店的房间号。
在C语言中地址又被称作指针
指针==内存单元编号==地址
1 得到一个变量的地址有几个方法呢?
第一种:取地址操作符(&)。
第二种:指针
取地址操作符(&)

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 ; }
上⾯代码中第5⾏就使⽤了解引⽤操作符, *pa 的意思就是通过pa中存放的地址,找到指向的空间, *pa其实就是a变量了;所以*pa = 0 ,这个操作符是把a改成了0 (因为pa是一个指针变量其是一个地址又因为使用了 解引⽤操作符解引用故名思义解掉操作符作用得到其地址对应的变量)。
有同学肯定在想,这⾥如果⽬的就是把a改成0的话,写成 a = 0; 不就完了,为啥⾮要使⽤指针呢?其实这⾥是把a的修改交给了pa来操作,这样对a的修改,就多了⼀种的途径,写代码就会更加灵活.
2.5 指针变量的⼤⼩
指针变量的⼤⼩是不是确定的呢?答案是确定的,机器有32位机器和64位机器,32位机器有32根地址线那我们把32根地址线产⽣的2进制序列当做⼀个地址,那么⼀个地址就是32个bit位,需要4 个字节才能存储。64位机器有64根地址线假设有64根地址线,⼀个地址就是64个⼆进制位组成的⼆进制序列,存储起来就需要 8个字节的空间,指针变量的⼤⼩就是8个字节。

X64环境输出结果

X86环境输出结果
结论:(指针变量的⼤⼩和类型⽆关,只要是指针变量,在同⼀个平台下,⼤⼩都是⼀样的)
• 32位平台下地址是32个bit位,指针变量⼤⼩是4个字节
• 64位平台下地址是64个bit位,指针变量⼤⼩是8个字节
•注意指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台(环境)下,⼤⼩都是相同的。
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。
结论:指针的类型决定了,对指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节)。
⽐如: char* 的指针解引⽤就只能访问⼀个字节,⽽ int* 的指针的解引⽤就能访问四个字节。
3.2指针+-整数

我们可以看出, char* 类型的指针变量+1跳过1个字节, int* 类型的指针变量+1跳过了4个字节。 这就是指针变量的类型差异带来的变化。指针+1,其实跳过1个指针指向的元素。指针可以+1,那也可以-1。
结论:指针的类型决定了指针向前或者向后⾛⼀步有多⼤(距离)。
3.3void* 指针
定义:在指针类型中有⼀种特殊的类型是 void * 类型的,可以理解为⽆具体类型的指针(或者叫泛型指针)。
优点:这种类型的指针可以⽤来接受任意类型地址。
缺点void* 类型的指针不能直接进⾏指针的+-整数和解引⽤的运算。
# 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 ; }
本篇文章就到此结束,希望有所能帮到 读者更好的了解指针,后续还会继续更新指针相关知识。