指针回顾总结(1)

一.指针变量

1.1 什么是指针?

1.2 指针类型

1.2.1 指针的类型

1.2.2 指针不同类型的意义

1.2.3野指针

1.3 指针运算

二.

1.1

一.指针变量

1.1 什么是指针

简而言之,指针变量就是存储地址的,我们通过指针变量,也就是所存地址可以找到你所需要的数据。

举个列子助我们理解:在大学中,指导员管理那么多人,不可能每个人住那个寝室都知道,所以指导员找同学就要知道该同学的寝室号,也就是地址,根据地址找到该同学。

那么这个例子中,指导员管理同学就好比电脑管理数据一样,找到所需要的数据也需要知道该数据的地址,通过地址找到该数据,而指针变量便是存储地址的。

下面以代码形式展示:

#include<stdio.h>
 
int main()
{
int a=0;
a=9;
int*p=&a;//p就是一个指针变量,类型是int*
printf("%p\n",&a);
printf("%p\n",p);
printf("%d\n",*p);
return 0;
}

 *p中的*是解引用操作符,就可以通过地址找到该地址存储的数据,

展示:

 1.2 指针类型

1.2.1 指针的类型

了解了什么是指针之后,就要具体讲讲它的类型了,

就如int*p=&a;  int*就说明p是一个指针变量,int*中的int则说明该指针指向的地址存储的数据是int类型。诸如此类,还有char* 、float* 、void*hy等等,大家可以举一反三去理解。

但是这些指针类型并不像基本类型一样,指针类型只与32位64位环境下有所区别,同意环境下所大小是一样的:

32位对应4字节

64位对应8字节

下面是64位环境下的代码展示

 1.2.2 指针不同类型的意义

那么指针大小一样 ,不同指针类型有什么意义呢?

代码2:

int main()
{
int a=0x11223344;
int *p2=(char*)&a;
*p2=0;
return 0;
}

代码1: 

int main()
{
int a=0x11223344;
int *p1=&a;
*p1=0;
return 0;
}
调试我们可以看到,代码2会将n的4个字节全部改为0,但是代码1只是将n的第⼀个字节改为0。
结论:指针的类型决定了,对指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节)。
⽐如: char* 的指针解引⽤就只能访问⼀个字节,⽽ int* 的指针的解引⽤就能访问四个字节。

1.2.3野指针

还有一种特殊的指针,即野指针:

野指针是指指向已经释放或未分配的内存的指针。在 C 语言中,指针是一种变量,它存储了内存地址。当指针指向的内存被释放或未分配时,该指针就成为了野指针。
 
野指针是一种非常危险的情况,因为它可能导致程序崩溃或产生未定义的行为。例如,当使用野指针进行读写操作时,程序可能会访问到错误的内存位置,导致数据损坏或程序崩溃。
 
为了避免野指针,需要在使用指针时非常小心。以下是一些避免野指针的方法:
1. 在使用指针之前,确保它已经被正确地初始化。

2. 在释放内存之后,将指针设置为 NULL ,以避免再次使用野指针。

3. 在使用指针时,使用 if 语句来检查指针是否为 NULL ,以避免使用野指针。
 
以下是一个简单的 C 语言程序,演示了如何使用指针和避免野指针:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr;

    // 分配内存
    ptr = malloc(10 * sizeof(int));
    if (ptr == NULL) {
        printf("内存分配失败\n");
        exit(1);
    }

    // 初始化指针
    for (int i = 0; i < 10; i++) {
        ptr[i] = i;
    }

    // 输出结果
    for (int i = 0; i < 10; i++) {
        printf("%d ", ptr[i]);
    }
    printf("\n");

    // 释放内存
    free(ptr);
    ptr = NULL;

    // 再次使用野指针
    for (int i = 0; i < 10; i++) {
        printf("%d ", ptr[i]);
    }
    printf("\n");

    return 0;
}

 
在这个程序中,首先使用 malloc 函数分配了 10 个整数的内存空间,并将指针 ptr 指向该内存空间。然后,初始化指针并输出结果。最后,使用 free 函数释放内存,并将指针设置为 NULL 。在释放内存之后,程序再次使用野指针进行读写操作,导致程序崩溃。
 
请注意,这个程序只是一个简单的示例,实际的程序可能更加复杂,需要更加小心地处理指针和内存管理。

1.3 指针运算

1.3.1指针加减整数

下面用代码展示指针运算:

首先,

pc的类型是char*,char的大小是1字节,所以pc+1就是地址+1,跳过一个char型

pi的类型是int*    ,int的大小是4字节,所以pi+1就是地址+4,跳过一个int类型

举一反三可以知道加减整数就是看该指针所存储的地址指向类型,加减整数就是加减整数*类型大小。

1.3.2指针减指针

指针加指针是非法的,无意义,

补充知识点,sizeof(arr)中的数组名arr指的是整个数组的地址,&arr也是整个数组的地址 ,其余情况下单独的数组名就是该数组首元素的地址。 

指针减指针,类如数组:

据上示代码可知: 

 指针相减的结果是它们之间的元素个数,这个数量的单位是指针所指向的数据类型的大小。

  • 27
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值