六、指针操作

前置

按照 ANSI(American National Standards Institute) 标准,不能对 void 指针进行算法操作

ANSI标准之所以这样认定,是因为它坚持:进行算法操作的指针必须是确定知道其指向数据类型大小的。

指针+1所增加的地址值为这个指针类型所占用的内存大小的值。

6.1 一级指针

  • int * p ; → 声明指针变量 p

  • 指针的内存空间为 4byte

    • 面试的时候问你,指针在内存中占多少个字节? 这就是个问题不是简单的2,4,甚至8个字节 回答:指针在内存中所在的字节数是由系统的寻址能力决定的,寻址能力就是CPU对于该数据范围处理的极限能力,理论上32位系统的寻址能力是2的32次,也就是32bit,按照一个字节8bit来算就是4个字节。16位系统是2个字节,64位的就是8个字节。寻址能力是由系统的硬件决定的,也就是总线的位数。 简单的总结下,16位的2字节,32位的4字节,64位的8字节,由系统的寻址能力决定。

  • 指针 p → 用来存储变量的地址

  • *p → 用来取 p变量存的地址处 的 内容

  • 声明时:int *p,q; q为整型不为指针;

  • int *q 声明后马上要初始化,如果不初始化,他就是一个野指针,不知道指向了内存中的什么位置,如果对该指针进行赋值操作的话,值就不知道存到什么地方去了

  • 指针的初始化 以及 赋值 ,应该 以 “地址” 赋值 → int a = 2; int * p = &a , *q; q = &a;

  • arr[10] 数组的名便可代表此数组的首地址,且arr为地址常量,不可在声明后,直接 arr = "ad" 赋值,所以赋值时,不可 p = &arr,而是 int *p = arr;

  • 指针可自加 → p++,内存中跳过 一个类型大小

  • 一维数组可认为自带的一个指针,如 arr[] , 但不能进行 arr++ 操作,可进行 arr+1 取地址操作;

    arr[] = {1,2,3,4,5}、printf("%d", *arr ); → 1

    printf("%d", *(arr+1) ); → 2

    printf("%d", *arr+2 ); → 3

  • 指向数组的两个指针 互减 输出值之间的元素个数

    int p,q;

    p = a ;

    q = a + 4 ;

    printf("%d", q-p); → 4

  • 指针的初始值在每次使用之前都需要 check 一下,例如 p++ 时;

  • 当 声明 int *p = a; 时,p就是数组的名字,可以 以 p[i] 的形式 读取与使用 数组 a[] 内的值,

  • 且在p[i] 运行的过程中,p所存的地址不变,但是在 p++ 之后的 p[i] 会加一读取内容。

  • 同时,若 不指向 a[ ],p也可以 使用 p[ ]

6.2 二级指针

  • 直接寻址 → 通过变量的名字访问到变量的空间,直接改址

  • 间接寻址 → 用指针把变量的地址保存上,后通过指针指向的地址找到变量的存储空间,修改其值、一级指针 存的是变量的地址、二级指针 存的是一级指针的地址、如果通过指针改变变量的值的时候是用*来取内容进行改变。

 在指针作为参数或返回值时 才有意义。
     例如:
             **ppa ---- *pa ---- a=3
             pa = &a;
             ppa = &pa;
 ​
             **ppa == a;

6.3 const + 指针

「拆分法」(最通用)
把声明从右往左读,const 修饰的是「最近的标识符」:
const char *c → 读为:c is a pointer to a const char(c 是指向 “只读字符” 的指针);

char const *c → 读为:c is a pointer to a char const(和上面完全一样,             

                                                                                      const char = char const);

char * const c → 读为:c is a const pointer to a char(c 是 “只读指针”,指向普通字符)。

实践:

char const * const *p;  
这是一个二级指针,二级指针p指向一个常量指针*p,常量指针指向一个const char **p
这个二级指针可变,指向的一级指针不可变,指向的变量不可变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值