C语言——指针详解

本文深入探讨了C++中的指针基础知识,包括指针的定义、指针加减整数、解引用、野指针及其产生原因、指针越界访问、指针指向已释放空间的问题及避免方法。此外,还介绍了二级指针的概念以及指针数组的用法。通过实例代码,解析了指针操作的细节,强调了正确使用指针以防止程序出错的重要性。
摘要由CSDN通过智能技术生成

目录

基础概念:

定义:

指针加减整数:

指针的解引用:

野指针:

指针未初始化

指针越界访问

指针指向的空间释放

避免野指针的方法:

二级指针:

指针数组:


基础概念:

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

指针是用来存放地址的,地址是唯一标示一块地址空间的。

指针的大小在32位平台是4个字节,在64位平台是8个字节。

定义:

char  *pc = NULL;
int   *pi = NULL;
short *ps = NULL;
long  *pl = NULL;
float *pf = NULL;
double *pd = NULL;

每个类型的指针指向他们相对应的类型,而指针的大小并不因其类型而有所不同,都是4个字节。

int num = 10;
p = #
*p = 20;

我们通过上述代码,把定义一个类型为int的指针p,其指向num所占用的空间,而*p就是把p解引

用,便可以访问到num,因此num现在变成了20.

指针加减整数:

int main() 
{
    int n = 10;
    char *pc = (char*)&n;
    int *pi = &n;
    printf("%p\n", &n);
    printf("%p\n", pc);
    printf("%p\n", pc+1);
    printf("%p\n", pi);
    printf("%p\n", pi+1);
    return  0;
}

通过上述代码,我们发现各个不同类型的指针加减相同的整数后的地址变化是不同的,其加减后与原先的差值便是这个类型所占用的内存空间大小。

指针的解引用:

#include <stdio.h>
int main() {
    int n = 0x11223344;
    char *pc = (char *)&n;
    int *pi = &n;
    *pc = 0;
    *pi = 0; 
    return 0;
}

通过上述代码,我们把int*类型的指针强制转化成char*类型的指针,在调试过程中,本来应该把int所指向的4个字节都变成0,但是由于这是char*类型,因此只把4个中的一个变成了0。

野指针:

野指针就是不符合要求的指针,其出现主要原因如下:

指针未初始化

#include <stdio.h>
int main() {
    int *p;
    *p = 20;
    return 0;
}

指针越界访问

#include <stdio.h>
int main() {
    int arr[10] = {0};
    int *p = arr;
    int i = 0;
    for(i=0; i<=11; i++)
    {
        *(p++) = i; 
    }
    return 0; 
}

这一点和数组越界访问是一样的,访问没有权限的地方,这里是随机值,任何情况都有可能发生,因此要规避这种情况发生。

指针指向的空间释放

这个一般会发生在动态开辟内存时空间释放时,在后续章节会提到,这里稍做了解即可。

避免野指针的方法:

指针初始化

小心指针越界

指针指向空间释放即使置NULL

避免返回局部变量的地址

指针使用之前检查有效性

二级指针:

由于指针也是一个变量,它也有属于自己的空间,所以我们可以再创建一个指针来指向这个指针的空间,就和套娃一样,理论上可以创建无数个多级指针。定义如下:

int a = 0;
int* pa = &a;
int** ppa = &pa;

那么二级指针如果解引用一次就访问的是一级指针pa,如果解引用两次就访问了变量a。

指针数组:

和整形数组,浮点数数组一样,指针数组不是指针,而是数组,是一组存放指针的数组。

int* arr3[5];

定义如上,我们可以拿它存储pa,pb,pc等指针,但是这种方法一般不常用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值