C# 指针详解(上)

指针的介绍

在内存中,内存是被分成一个个内存单元的,每个内存单元都被分配有各自的编号,这些编号就相当于这些内存单元的地址,可以通过找到它们的地址,就可以对内存单元进行访问了,为了方便访问内存空间中的内容,在c语言中就出现了指针,指针是用来存放内存单元的地址的,我们可以通过该内存单元的地址“指向”的位置就可以访问内存单元中的内容了,这种“指向”内存单元的地址的东西,我们就把它称为指针,用来存放内存单元地址的变量称为指针变量。

取地址操作符(&)和解引用符号(*)

  1. 取地址操作符(&)
    &该符号就是可以拿到一个变量的地址,也就是拿到该变量在内存中开辟的内存空间的地址
int main()
{
    int a = 20;//变量创建的本质其实是向内存申请4个字节的空间,用来存放20这个数值
   int *pointer_a = &a;//&a--取到 a的地址,这个地址是4个字节中最小的那个字节的地址
    //pointer_a是一个指针变量,用来存放a的地址(指针)
    //这个*表示pointer_a是指针变量,int表示pointer_a指向的变量a是整型int
    //int*表示pointer_a的类型
    return 0;
}

为了大家更好的理解,上面的代码表示出来是这样的:
在这里插入图片描述
0x0099fc74,相当于a的地址,将其放入指针变量pointer_a中存放,使该指针变量指向了a。

  1. 解引用符号(*)
int main()
{
    int a = 10;
    int *pointer_a = &a;
    *pointer_a = 20;
    printf("a = %d\n",a);//结果 a = 20
    //该解引用操作符也叫间接访问操作符,对该指针变量指向的变量的内容进行修改或者获取
    //*pointer_a的意思就是通过pointer_a存放的地址,然后找到该地址指向的空间,*pointer_a其实也就等价于a这个变量了
    return 0;
}

指针变量的大小

  • 32位平台下,地址是32个bit位,指针变量即4个字节
  • 64位平台下,地址是64个bit位,指针变量即8个字节

所以指针变量的大小与类型无关,只跟环境有关

指针类型的意义
  1. 指针为(int*)类型的解引用操作
    代码一:
    在这里插入图片描述
    在这里插入图片描述

下面是指针为(char*)类型的解引用操作
代码二:

在这里插入图片描述
在这里插入图片描述

两个代码进行比较可以看到char的指针解引用就只能访问一个字节,二int的指针解引用就能访问4个字节。

结论:指针的类型决定了指针对指针解引用的时候一次能操作几个字节

  1. 指针 ± 整数
    在这里插入图片描述

可以看出,char类型的指针变量+1跳过了一个字节,int类型的指针变量跳过了4个字节

结论:指针类型决定了指针向前或者向后走一步是多大距离
int* pointer_a:pointer_a + n 相当于偏移 nsizeof(int) 个距离
char
pointer_a:pointer_a + n 相当于偏移 n*sizeof(char) 个距离

字符指针变量
char *p = "abcdefg";

常量字符串,这里的赋值是将字符串中首字符的地址赋值给p

泛型指针和野指针
  • 泛型指针

void*-----代表无具体类型的指针
可以接收任何类型的地址
void类型的指针不能进行解引用操作和指针 ± 整数的运算

  • 野指针

野指针的定义:指针指向的定义是不可知的(随机的,不正确的,没有明确限制的)
野指针的成因:指针未初始化,指针越界访问,指针指向的空间被释放

  • 35
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值