zoukankan      html  css  js  c++  java
  • C语言进阶--DAY3

    主要讲解数组和指针有关问题

    1. 数组名的本质是一个常量指针

    2. 内存编址的最小单位是字节,对于变量来说,一个变量可以取1、2、4、8等字节,对变量取地址来说,取的是低位字节的地址,在32位机中其对变量取地址就是4,不管其占几个字节。如下例

    经过分析我们可以得出:指针的大小为4

    3. 指针的本质:一个有类型的地址

    以上实验说明指针是一个有类型的地址,常量指针

    4. int p中,*号起的作用是指针的声明以及指定大小,类型决定寻址能

    对于这个*号,注意如下的情况

    int *p=&data;(1)

    printf(“%x ”,*p);(2)

    (1)(2)两处的*是不一样的,(1)处的是指针的声明,(2)处的于与&data之间的引用和解引用的关系

    5. 指针的运算,指针的+1和数值的+1是不一样的,观察下列程序

    输出结果分别为:0x15,  -5,  5

    注意到第一个输出结果是指针的相加,步长为4,后两个为数值的加减,步长为1

    6. 数组名作为成员访问的时候就是一个一级指针, &  和 * 实现了一级指针(数组名)到数组指针之间的切换

    输出的结果为:

    arr       = 0xbffd24dc

    arr+1     = 0xbffd24e0

    &arr      = 0xbffd24dc

    &arr+1    = 0xbffd24f0

    *&arr     = 0xbffd24dc

    *&arr+1   = 0xbffd24e0

    7. 为了帮助理解数组在内存中的线性存储,做以下练习

    由已学知识,数组在内存中的存储如下

    a代表数组名,本来是一次跳动的格数为4,当对其取地址后,&a+1直接跳到蓝色的箭头那里,ptr1[-1]也可以写做*(ptr1-1),即向下移动4个单元格,因此移动到绿色箭头处,从绿色箭头开始向上打印出四个单元格,即5

    对a进行强转即(int)a使得其每次跳动的格数为1,即(int)a+1跳转到紫色箭头处,由此开始向上打印4个单元格,即2000000;

    8. 二级指针:

    char ch=’m’;

    char  *pc=&ch;

    char*  *ppc=&pc

    此处对两个*的解释为:*ppc代表此为一个指针,char*表示此指向类型是一个指针类型

    通过二级指针,实现了对数据空间的间接访问,如下所示

    通过二级指针,可以改变一级指针的指向问题,见下列例子

    注意:想要改变指针指向的内容,就必须要传递指针的地址,因此会出现二级指针

    通过一级指针可以改变0级指针指向问题

    通过二级指针可以改变一级指针指向问题

    通过三级指针可以改变二级指针指向问题

    8. 通过对二级指针,改变了一级指针的指向问题,也叫对一级指针的初始化问题

    如上所见,指针p原本指向一个空指针,改变指向后使其指向一个有200个字节的空间,也可以看作是对其的一次初始化

    9. 一级指针和二级指针的步长

    一级指针的步长是与其类型相关的,二级指针的步长是固定的4,扩展:二级以上的指针的步长都是4

    long long* *pp=&p;但凡有long long*的都是一个指针的大小,因此步长是4

    10. 指针数组(字符指针数组):指针数组的本质是数组,数组中的每一个成员是一个指针

    char * pARR[10]={“apple”,”banana”,”orange”};

    数组指针:本质是一个指针,int (*p)[4]—其本质应为int[4] *p,可见本质是一个指针

    10. 二级指针访问指针数组

    由于指针数组的本质就是一个数组,因此在学习时可以类比数组的访问,数组访问方法:下标访问(偏移)以及指针访问

    等价性:

        int arr[10]={1,23,4};

    int *p=arr;   //此处的等价性为:arr即为数组的首地址,

    &arr[0] à&int àint *

    由于在数组中我们常常用指针来进行访问,因此我们想用指针来访问指针数组

    类比利用一级指针对数组进行访问,可以得出利用指针对指针数组的访问

    对于char *  *p=pa来说,pa 相当于&pa[0]à&char *àchar **即为一个二级指针

    pa和**p完全等价的原因:

    其中箭头代表指向关系

    pa代表指针数组的首元素地址,pa+1每次加4,char*+1也是每次加4,在图中表示一个单元格的范围

    同时,由于p=pa,因此pa[1]代表的地址为0x14c0b,p[1]代表的地址也是0x14c0b

  • 相关阅读:
    [LeetCode每日1题][简单] 169. 多数元素
    [LeetCode每日1题][简单] 1013. 将数组分成和相等的三个部分
    [LeetCode每日1题][中等] 322. 零钱兑换
    [LeetCode每日1题][中等] 面试题59
    软工实践个人总结
    2019 SDN大作业
    2019 SDN上机第7次作业
    第01组 Beta版本演示
    如果有一天我变得很有钱组——alpha冲刺day7
    如果有一天我变得很有钱组——alpha冲刺day6
  • 原文地址:https://www.cnblogs.com/Cucucudeblog/p/9726507.html
Copyright © 2011-2022 走看看