剖析指针,清晰明了,不再畏惧

一、指针是什么

先了解内存,内存是存储区域
编号—>地址—>指针

指针理解的2个要点:

  1. 指针是内存中一个最小单元的编号,也就是地址
  2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量

指针就是地址,口语中说的指针就是指针变量。

指针变量

我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个
变量就是指针变量

#include <stdio.h>
int main()
{
 int a = 10;//在内存中开辟一块空间
 int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。
    //a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量
中,p就是一个之指针变量。
 return 0;
}

指针变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。
总结:

  1. 指针是用来存放地址的,地址是唯一标示一块地址空间的。
  2. 指针的大小在32位平台是4个字节,在64位平台是8个字节。

二、指针与指针类型

1、指针的解引用

  1. 指针类型决定了指针进行解引用操作的时候访问几个字节(权限)。

cahr* 的指针解引用访问1个字节
int* 的指针解引用访问4个字节
double* 的指针解引用访问8个字节

2、指针±整数

  1. 指针类型决定了步长(向前/向后 走一步走多大的距离)

int* 指针+1的意思是跳过一个整型,也就是向后走4个字节
char+1 指针+1的意思是跳过一个字符,也就是向后走1个字节
double*+1 指针+1的意思是跳过一个double,也就是向后走8个字节
short*+1 指针+1的意思是跳过一个短整型,也就是向后走2个字节

三、野指针

概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

1、野指针的成因

  1. 指针未初始化
#include <stdio.h>
int main()
{ 
 int *p;//局部变量指针未初始化,默认为随机值
    *p = 20;
 return 0;
}
  1. 指针越界访问
#include <stdio.h>
int main()
{
    int arr[10] = {0};
    int *p = arr;
    int i = 0;
    for(i=0; i<=11; i++)
   {
        //当指针指向的范围超出数组arr的范围时,p就是野指针
        *(p++) = i;
   }
    return 0;
}
  1. 指针指向的空间释放
int* test()
{
   int num = 100;//使用完tset函数后存储的100就被销毁了
   return &num;
}
int main()
{
   int* p = test();
   *p = 200;
   return 0;
}

2、规避野指针

  1. 指针初始化
  2. 小心指针越界
  3. 指针指向空间释放即使置NULL
  4. 避免返回局部变量的地址
  5. 指针使用之前检查有效性

四、指针的运算

1、指针±整数

#define N_VALUES 5
float values[N_VALUES];
float *vp;
//指针+-整数;指针的关系运算
for (vp = &values[0]; vp < &values[N_VALUES];)
{
     *vp++ = 0;
}

2、指针 - 指针

  • 两个指针相减的前提是:指针指向同一块连续的空间。
  • 没有 指针 + 指针。
int main()
{
   int arr[10] = {0};
   printf("%d\n",&arr[9] - &arr[0]);
   return 0;
}

指针 - 指针得到的是元素的个数。

计算字符串的长度

  1. strlen函数
  2. 方法my_strlen,用while循环
  3. 递归
  4. 指针 - 指针
int my_strlen(char* str)
{
   cahr* start = str;
   while(*str != '\0')
       str++;
   return str - start;
}
int main()
{
   char arr[] = "abcdef";
   int len = my_strlrn;
   printf("%d\n",len);
}

3、指针的关系运算

标准规定

允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与
指向第一个元素之前的那个内存位置的指针进行比较。

五、指针和数组

数组和指针不是一个东西
数组能够存放一组数,连续的空间,数组大小取决于元素的个数
指针是一个变量,是存放地址的,4 / 8个字节

联系:
数组名是地址(指针)。
数组吧首元素的地址交给一个指针变量后,可以通过指针来访问数组。

int main()
{
 int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
 int *p = arr; //指针存放数组首元素的地址
 int sz = sizeof(arr) / sizeof(arr[0]);
 int i = 0;
 for (i = 0; i<sz; i++)
 {
 printf("%d ", *(p + i));
 }
 return 0;
}

六、二级指针

在这里插入图片描述

七、指针数组

指针数组是数组。是存放指针的数组。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小琚子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值