0
点赞
收藏
分享

微信扫一扫

C语言学习之旅 指针初阶

janedaring 2022-08-11 阅读 189

1.指针是什么

编程语言中的对象,指向电脑存储器中另一个地方的值,也可以理解为内存单元的编号(地址)

2.指针类型的意义

  1. 指针类型决定了访问权限的大小
  2. 指针类型决定了指针走一步的步长

3. 野指针

3.1 概念

指向的位置随机,不可知(非法访问内存)

3.2 成因

  1. 指针未初始化
    ```c++
    int main()
    {
    int p; // p是一个局部指针变量,局部变量不初始化默认是随机值
    p = 20; //非法访问内存 --程序无法运行
    return 0;
    }
  2. 指针越界访问
    ```c++
    int main()
    {
    int arr[10] = { 0 };
    int p = arr;
    int i = 0
    for (i = 0; i <= 10; i++)
    {
    p = i;
    p++ //循环了11次,但i的长度仅为10,第是一次访问属于越界访问
    }
    return 0;
    }
  3. 指针指向的空间释放
    ```c++
    int test()
    {
    int a = 10;
    return &a;
    }
    int main()
    {
    int
    p = test();
    *p = 20; //当函数结束后,内部的值已经被释放,所以属于非法访问
    return 0;
    }
    
    ### 3.3如何避免野指针
  4. 指针初始化(两种方式)

int p = NULL; -->需要 <stdio.h>
int
pa = &a;

  1. 小心指针越界 --> c语言本身不检查数据越界行为
  2. 空间被释放时放置NULL
  3. 指针使用前要检查有效性
    ```c++
    int main()
    {
    int p = NULL;
    if(p!= NULL)
    p = 10;
    return 0;
    }
    
    ## 4. 指针的运算
    ### 4.1 指针加减整数

4.2 指针-指针整数

指针-指针得到两个指针间的元素个数

注意:两个指针的类型要相同(要指向同一块空间)

```c++
int my_strlen(char s)
{
char
start = s;
while (*s != '\0')
{
s++;
}
return s - start;
}

int main()
{
int len = my_strlen("abc");
printf("%d\n", len);
return 0;
}


## 5. 二级指针?
指针地址的地址

```c++
int main()
{
    int a = 10;
    int* pa = &a;
    int** ppa = &pa;
    printf("%d\n", ppa);
    return 0;
}

6.指针数组

整型数组 --> 存放整形的数组
指针数组 --> 存放指针的数组

```c++
int* parr[5];



![](%E6%8C%87%E9%92%88%E5%92%8C%E6%95%B0%E7%BB%84_md_files/7e8eb750-1861-11ed-8fa6-0fa6206b1f6c.jpeg?v=1&type=image)
举报

相关推荐

0 条评论