指针的定义与本质——间接访问原理

一、指针的定义

内存区域中的每字节都对应一个编号(即地址)。如果在程序中定义了一个变量,那么在对程序进行编译时,系统会自动给这个变量分配内存单元。按变量地址存取变量值的方式称为“直接访问”,如printf(“%d,i);、scanf(“%d”,&i);等。另一种存取变量的方式称为“间接访问”,即将 变量i的地址存放到另一个变量中。C语言中指针是一种特殊的变量,它用来存放变量地址。

指针变量的定义格式如下:

基类型 *指针变量名

eg.int *i_pointer;

(1)指针:一个变量的地址。eg.地址2000是变量i的指针。

(2)指针变量:一个变量专门用来存放另一变量的地址(即指针)。

说某个变量的地址时,讲的是它的起始地址。

i_pointer本身站多大的内存空间呢?本章中编写的程序都是64位应用程序,寻址范围为64位即8字节,所以本章sizeof(i_pointer)=8。如果编写的程序是32位,那么寻址范围就是4字节(考研中会强调程序是32位的程序)。

二、取地址操作符与取值操作符

取地址操作符为&,也称引用,通过该操作符我们可以获取一个变量的地址值;取值操作符为*,也称解引用,通过该操作符可以得到一个地址对应的数据。

eg.通过&i获取整型变量i的地址值,然后对整型指针变量p进行初始化,p中存储的是整型变量i的地址值,所以通过*p(printf函数中的*p)可以获取整型变量i的值。p中存储的是一个绝对地址值,为什么取值时会获取4字节大小的空间?——因为p为整型变量指针,每个int型数据占用4字节大小的空间,所以p在解引用时会访问4字节大小的空间,同时以整型值对内存进行解析。

//  &符号是取地址,指针变量的初始化一定是某个变量取地址

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int i=5;
    //指针变量的初始化是某个变量取地址来赋值,不能随机写个数
    int *i_pointer=&i;//定义一个指针变量,i_pointer是指针变量名
    printf("i=%d\n",i);//直接访问
    printf("*p=%d\n",*i_pointer);//间接访问
    return 0;
}

三、指针的本质

注意以下3点。

(1)指针变量前的“*”表示该变量为指针型变量。

eg.float *pointer_1;

注意指针变量名是pointer_1,而不是*pointer_1.

(2)在定义指针变量时必须指定其类型。只有整型变量的地址才能放到指向整型变量的指针变量中。

(3)如果已执行了语句pointer_1=&a;那么&*pointer_1的含义是什么呢?

“&””*”两个运算符的优先级别相同,但要按自左向右的方向结合。因此,&*pointer_1与&a相同,都表示变量a的地址,也就是pointer_1.

*&a的含义是什么呢?

首先进行&a运算,得到a的地址,再进行*运算。*&a和*pointer_1的作用是一样的,都等价于变量a,即*&a与a等价。

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LucyLee04

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值