Bootstrap

【嵌入式】数组与指针的关系

一、引入

![中所在这里插入图片描述](https://i-blog.csdnimg.cn/direct/77ed57ebaa054bbdac23b7cff775fdac.png
实验手册:告诉学生去哪个柜子拿、放东西
1.从2号柜子取出里面的东西
2.放入3号柜子
3.如果3号柜子的东西数量超过10,取出1个,放到5号试管
4.如果3号柜子的东西数量超过10,继续执行步骤3

二、程序就是告诉CPU去读、写某些地址

在这里插入图片描述

    volatile char b[10] = "abc";
    
    volatile char *p;
    
    p = b;

b就是首地址0到9分别对应10个柜子
b就是首地址,0到9分别对应10个柜子
char是一种数据类型就像int,float之类 ,其中**char ***其实也是一种数据类型无非就是定义的地址,无论是int *还是char *都是32位(二进制)的,也就是4byte。

三、地址的地址是什么?

在这里插入图片描述
&是取地址的符号,p是char类型的指针,肯定有对应的地址来保存这个指针那就是&p,也就是p的地址,即地址的地址,

四、怎么访问后面的地址的数据?

在这里插入图片描述
到底是不是上面那样呢?
在这里插入图片描述
x指针的运算单位是sizeof(x)
在这里插入图片描述
地址移动的位数是由指针类型确定的,这是内部定义好的,记住即可,方便我们使用。

四、总程序


#include <stdio.h>

int mymain(void)
{
    volatile char b[10] = "abc";
    
    volatile char *p;
    
    p = b;
        
    printf("&p = 0x%x\n\r", &p);
    printf("p = 0x%x\n\r", p);
    printf("b = 0x%x\n\r", b);

    p[0] = 'A';
    printf("b[0] = %c\n\r", b[0]);
    printf("p[0] = %c\n\r", p[0]);
    
    volatile int c[3] = {0x100, 0x200, 0x300};
    volatile int *p2;

    printf("before:\n\r");
    printf("c[0] = 0x%x\n\r", c[0]);
    printf("c[1] = 0x%x\n\r", c[1]);
    printf("c[2] = 0x%x\n\r", c[2]);
    
    p2 = c;
    
    p2[1] = 0x12345678;
    
    *(p2 + 2) = 0xffffffff;
    
    printf("after:\n\r");
    printf("c[0] = 0x%x\n\r", c[0]);
    printf("c[1] = 0x%x\n\r", c[1]);
    printf("c[2] = 0x%x\n\r", c[2]);

    
    return 0;    
}

本代码可以使用keil5软件进行debug调试
最后,感谢韦神(韦东山)!