指针初阶1

指针是什么?

我们可以这样理解

编号——地址——指针         地址存起来需要变量,所以存放地址的变量又被称为指针变量

int main()
{
    int a = 10;//在内存中开辟一块空间,a占4个字节
    int * pa = &a;//对变量a取出它的地址,拿到的是a的4个字节中第一个字节的地址
    //将a的地址放入pa变量中,*说明pa是指针变量
        *pa = 20;
    return 0;
}

总结:(1)内存被划分成了一个个小单元,一个单元一个字节;

(2)对每个小单元进行编号(3)要把编号存起来,所以引出指针变量存放地址

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

指针和指针类型

 指针的大小相同,那么说明指针类型是没有意义的,这么说是不是可以创建一个通用类型的指针呢?但现实确是不行的,所以也可以说明指针类型是又意义的

指针类型的意义是什么?

1、指针类型决定了:指针解引用的权限有多大(能操作几个字节);

int能访问4个字节

 char能访问1个字节

 2、指针类型决定了:指针走一步,能走多远(步长) 

 字符指针+1相当于跳过了1个字符,所以+1;整型指针+1相当于跳过了一个整型,所以+4.

p+1加几取决于p的类型,与p指向的对象和赋的值没有关系

3、 野指针

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

野指针的成因

(1)指针位初始化

#include <stdio.h>
int main()
{
    int *p;//局部变量指针未初始化,默认为随机值
    *p = 20;//非法访问内存
    return 0;
}

2、指针越界访问

int main()
{
    int arr[10] = { 0 };
    int* p =arr;
    int i = 0;
    for(i=0;i<=10;i++)
    {
        *p = i;
         p++;   
    }
    return 0;
}

 3、指针空间的释放

int * test()
{
      int a = 10;
      return &a;//a出来后结束了生命周期,所以就销毁了
} 
int main()
{
     int *p = test();
     *p = 20;
     return 0;
}
详见动态内存

如何规避野指针

(1)指针初始化

*当不知道p应该初始化为什么地址时,直接初始化为NULL

int* p = NULL;

*明确知道初始值

int a = 10;
int* ptr = &a;

(2)小心指针越界——c语言本身不会检查数据的越界行为

(3)指针指向空间施放及时置NULL

(4)指针使用之前检查有效性

int* p = NULL;
if(p !=NULL)
     *p = 10;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值