C语言初阶———指针(1)

//指针类型的意义
#include<stdio.h>

int main(void)
{
    int a=0x11223344;
    char* pc = &a;
    *pc=0;//char类型,字符指针,解引用一次访问了1个字节
//字符类型发生变化,解引用内容就发生了变化
    int* pc = &a;
    *pc=0;//int类型,解引用一次访问了4个字节
//指针类型的意义:
//1.指针类型决定了指针解引用的权限有多大
//2.指针类型决定了指针走一步,走多远(步长)

 

#include<stdio.h>

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

指针就是变量,用来存放地址的变量。(存放在指针当中的值都被当作地址处理。)

整型指针加1会跳过一个整型,字符指针加1会跳过一个字符。

//指针的解引用

#include<stdio.h>

int  main(void)
{
    int arr[10] = {0};  //创建一个数组为arr,有十个全是0的元素
    int *p = arr;  //访问arr的地址
    int i = 0;     //按顺序访问数组元素的下标
    for (i=0;i<10;i++)
    {
       *(p+i) = 1;  //p+i 其实是下标为i的地址,这一步实为将arr数组中的元素都赋值为1
    }               //重点在调试的过程中观察内存的变化
    return 0;
}

指针的解引用总结:

指针的类型决定了,对指针的解引用的时候有多大的权限(能操作几个字节),char*的指针解引用就只能访问一个字节,而int *的指针的解引用就能访问4个字节

野指针:

(概念):指针指向的位置是不可知的

//野指针的成因:
//1.指针未初始化

#include<stdio.h>

int main(void)
{
    int *p;   //p是一个局部的指针变量,局部变量如果补初始化的话,默认是随机值
    *p = 20;  //非法访问内存,p未初始化里面存的是一个随机值,*p解引用,就是访问这个随机值的地址
               //这里的p就是一个野指针
    return 0;
}
//野指针的成因
//2.指针越界访问

#include<stdio.h>

int main(void)
{
    int arr[10] = {0};
    int* p = arr;  //把数组名交给了指针变量p
    int i = 0;
    for(i=0;i<=11;i++)  //这里实际上循环了11次
    {
        //当指针指向的范围超过数组arr的范围时,p就是野指针
        *(p++)=i;
    }
    return 0;
}
//野指针的成因:
//3.指针指向的空间释放

#include<stdio.h>

int* test()   //返回类型为int*
{
    int a =10;
    return &a;  //在这里范围a的地址
}
int main(void)
{
    int* p = test();  //调用test函数,用int *的p地址来接收一下
    *p=20;
    return 0;  //a 是放不进去20的,函数调用出int* test的时候,a这个局部变量的生命周期已经被销毁
               //这个四个字节的内存已经被还给操作系统了,如果再用*p = 20 去访问这块空间的地址,属于非法访问
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值