本章介绍:
主要讲解指针的入门
让你们轻松拿下C语言指针基础
相信你们耐心看完会有所收获
1 指针是什么?
指针理解的2个要点:
1. 指针是内存中一个最小单元的编号,也就是地址
2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
那什么是指针变量?
通过&取地址操作符取出变量在内存中的起始地址,将取出的地址存放在一个变量中,这个存放地址的变量就是指针变量
#include <stdio.h> int main() { int a = 10;//在内存中开辟一块空间 int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。 //a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量中 //p就是一个之指针变量。 return 0; }
总结:
指针就是地址,口语中说的指针通常指的是指针变量。
指针变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。
2 指针和指针类型
这里我们在讨论一下:指针的类型
我们都知道,变量有不同的类型,整形,浮点型等。那指针有没有类型呢?
准确的说:有的
- 当有这样的代码:
int num = 10; p = #
要将&num(num的地址)保存到p中,我们知道p就是一个指针变量,那它的类型是怎样的呢?指针的类型是一个类型名加*组合我们给指针变量相应的类型。
char *pc = NULL; int *pi = NULL; short *ps = NULL; long *pl = NULL; float *pf = NULL; double *pd = NULL;
这里可以看到,指针的类型是一个类型名加*组合
其实:
- char* 类型的指针是为了存放 char 类型变量的地址。 - short* 类型的指针是为了存放 short 类型变量的地址。 - int* 类型的指针是为了存放 int 类型变量的地址。
指针类型虽然有很多种,但指针类型在相同的平台大小都相同!
指针的大小在32位平台是4个字节,在64位平台是8个字节。
2.1 指针±整数
指针是可以加减整数的,指针加减整数也是等于指针
指针类型决定了:指针走一步走多远(指针的步长)
intp; p+1 --> 4
charp; p+1 – > 1
double* p; p+1–>8
总结:指针的类型决定了指针向前或者向后走一步有多大(距离)。
2.2 指针的解引用
指针类型决定了指针进行解引用操作的时候,能够访问空间的大小
1. int*类型接收地址,能够访问4个字节空间
2. 如char*类型接收地址,能够访问1个字节空间
3 如short *类型接收地址,能够访问2个字节空间
总结:
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。 比如:
char 的指针解引用就只能访问一个字节
而 int 的指针的解引用就能访问四个字节。
3 野指针
概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
3.1 野指针成因
- 1.指针未初始化
局部变量指针未初始化,默认为随机值
如果访问会造成野指针
- 2.指针越界访问
当指针指向的范围超出数组指定的范围时候,p就是野指针
- 3.指针指向的空间释放
当函数返回时,函数会被销毁同时n的地址会跟着销毁
但是ret记住了n的地址, 如果进行访问会造成野指针
3.2 如何规避野指针
1. 指针初始化
2. 小心指针越界
3. 指针指向空间释放,及时置NULL
4. 避免返回局部变量的地址
5. 指针使用之前检查有效性
6. 一个指针不知道应该指向哪里的时候,暂时可以初始化为NULL;
4 指针运算
4.1 指针-指针
指针-指针=地址-地址 两个指针指向同一块空间指针的类型是一致的
指针-指针得到的是指针和指针之间的元素个数
指针加整数等于指针,指针减指针等于整数
- 看看以下代码输出结果是几`
int main() { int nums[] = {1,2,3,4,5,6,7,8,9,10}; int p =&nums[9]=&nums[0]; printf("%d\n",p); }
解析:
针减指针得到的是指针与指针之间的元素个数 所以这个是9
- 用指针方法模拟实现strlen
解析:
只需要用到我们上面所说的知识便可解出
先把指针赋值给另外一个指针,
然后当有一个指针一直循环到’\0’结束
两个相减即可
4.2 指针的关系运算
标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
指针p1 不可以和第一个元素之前那个内存位置的指针p3比 。
5 指针和数组
很多入门的朋友指针和数组分不清楚!理解如下
指针就是指针,不是数组,数组就是数组,也不是指针
指针的大小: 4/8 个字节,指针是存档地址的,地址的存放需要多大空间,指针变量的大小就是多少。
数组的大小: 取决数组的元素个数和每个元素的类型
但是:
指针可以指向数组元素的因为指针可以运算
所以借助于指针可以访问数组
那我们直接通过指针来访问数组。 如下
6 二级指针
指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?
这就是 二级指针 。
对于二级指针的运算有:
**ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作: *pa ,那找到的是 a . .
*pa 通过对a中的地址进行解引用,这样找到的是 a , *pa 其实访问的就是 a
7 指针数组
指针数组是指针还是数组?
答案:是数组。是存放指针的数组。
- 指针数组
int* arr3[5]
arr3是一个数组,有五个元素,每个元素是一个整形指针
既然能够把多个整型或者字符放到地址里面处
那能不能多个地址放在数组里面?
- 答案是可以的 运用指针数组即可完成