01大学-指针进阶

67 阅读3分钟

如何描述一个空间; image.png

屏幕截图 2025-05-24 134122.png

用于存储p1和p2的空间的大小是确定的,但是p1p2它们用钥匙打开后进行访问,访问是由前面的int之类的数据类型决定的;

image.png 如何读取c的变量声明;

image.png

  • 定位变量名,先看右边,在看左边;
  • int a1; a1先看右边没有东西,看左边int所以a1是一个int类型的变量;
  • int a2[5];a2先看右边[5]所以可以大体确定这是一个数组,看左边int表示数组里面每一个都存储了一个int类型;
  • int a3;a3先看右边没有东西,看左边一个号表示这是一个指针,看左边int表示打开空间后访问形式是一个int进行访问;
  • 高级变形;
  • int a4[5];a4看右边[5],表示大体上是一个数组,然后向左看表示每一个数组都存了一把钥匙,a4是一个int[5]的访问;在向左看int表示a4[]是一个int访问;要把a4[]看成一个整体;
  • int (*a5)[5];右括号先看括号里面的,*a5表示大体上是一个指针(钥匙),这个钥匙打开后进行一个int[5]访问;
  • int a6[3][4];先看右边是一个数组,在看右边又是一个数组,二维数组,看左边int表示,每一个数组空间都是存储了一个int类型的值;a6在访问时,是以int[4]进行访问;
  • int *a7[3][4];先看右边[3]大体确定是一个数组,再看右边[4],是一个二维数组,看左边,*表示每一个数组里面存储的都是一个地址(钥匙),再看左边int表示a7在访问时是一个int[4]的访问;而a7[][]是一个int类型的访问,要把a7[][]看成一个整体

image.png

这种写法不对

  1. date的访问是一个char[4]进行访问;想要p1与date一样,我们需要p1也是一个char[4]进行访问;这个就是指针与数组之间的联系的一部分;

我们需要搞懂的两个东西

  1. 这个变量这么访问;
  2. 这个变量的某一部分的钥匙打开后是这么访问;
int a[3][5] = {
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15}
};

// int (*a1)[5] = a;
// printf("%d\n", a1[0][4]);//干越界了;
int * p = a;
for (int i = 0; i < 15; ++i) {
    printf("%d\n", *(p + i));
}

在c语言中内存的访问是很灵活的,比如上面的代码,我的p是一个int进行访问,它依旧可以访问到a全部的内存以及里面对应的值;

int a[3][5] = {
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,130}
};

// int (*a1)[5] = a;
// printf("%d\n", a1[0][4]);//干越界了;
char * p = a;
for (int i = 0; i < 15 * 4; ++i) {
    printf("%d\n", *(p + i));
}
//它们最关键的不是在于每一次访问加几个字节,而是在获取时是获取多少区域的二进制,进而进行到十进制的转换
//比如我们的上面的这一段代码,它们一开比较小的数没什么问题,但是一个数变大了之后,一个字节无法表示,那么那个数就需要多个字节进行表示;
//但是char类型的指针只能读取一个字节里面的数据,而int却是可以读取四个字节里面的数据;把他们转化成十进制;

无论是直接对一个指针p进行加减还是用数组的方式(p[][])再在它的前面加上&获取当前的地址值,都只是在对这个指针所记录的地址进行一个类似于查找的操作;