九日集训(第四天)指针

117 阅读4分钟

九日集训(第四天)指针

7、内存申请

​ C语言中,利用函数malloc来申请内存,传入参数为申请内存的字节数,返回值为申请到的内存的首地址,是什么类型的地址,就要强转成什么类型,如下:

img

​ p 代表的是申请到的内存,并且有效内存字节数为 1024。 如果我们要申请一个长度为 n 的整型数组的内存,可以这么写:

img

​ 其中 sizeof(int) 表示的是一个 int 占用的字节数,那么一个长度为 n 的 int 类型的数组,需要的字节数自然就是 sizeof(int) * n。

8、返回数组

​ 一般在刷题的时候,要求返回一个数组,这就比较尴尬,尴尬在哪里呢? 因为函数只能有一个返回值,而数组除了需要知道数组的首地址,还需要知道数组元素的个数。 所以,一般做法是,通过函数的参数传递一个指针变量进来,然后让调用者去填充这个指针变量,如下:

img

​ 这里的 returnSize 是一个指针,它指向的就是一个代表数组长度的变量,它是没有赋值的,需要我们通过解引用对它进行赋值。 函数的调用方,其实是这么调用的:

img

​ 这里的 &rSize 含义就是取了 rSize 的地址,传递给 returnSize 时,自然就成了指针。这样,在函数内部对*returnSize 进行修改,自然就改了 rSize 的值,调用函数的一方自然就知道这个数组的长度了。 好了,今天的内容比较难,如果不懂,一定要在评论区留言告诉我,我会不断改善这块内容,争取能让更多的人听懂。

解释

在C语言中,函数返回的是单个值,但如果我们想要从函数中返回整个数组,我们必须采取一些特殊的措施。通常,数组是通过指向其第一个元素的指针来操作的。但这还不够,因为我们还需要知道数组中有多少个元素。在C中,数组本身不会告诉我们它有多少元素,这就是为什么我们需要单独传递大小信息。

在您的代码示例中,getList 函数返回一个指向整数的指针,这个指针是指向由函数生成或修改的数组的。为了传递数组的大小信息,函数还接受一个指向整数的指针 returnSize 作为参数。在函数内部,您将通过解引用这个指针(即 *returnSize)来设置数组的大小,这样调用者就可以知道返回的数组有多大了。

在主调函数中,您传递了 &rSizegetList,这是 rSize 变量的地址。getList 函数将使用这个地址来填充数组的大小。所以当 getList 通过指针修改 *returnSize 时,实际上就是在修改 rSize 的值。当 getList 函数返回后,rSize 将包含数组的大小,而 ret 指针将指向数组的第一个元素。因此,调用函数的一方现在有了数组的地址和大小,能够完全访问和使用这个数组。

总的来说,通过在函数参数中使用指针来传递额外的信息,您可以实现从函数返回多个值。在这个例子中,通过返回数组的首地址并通过指针参数返回数组的大小,getList 函数能够有效地返回一个数组及其大小给调用者。

9、范式

​ 所谓范式,就是规范写法的意思。就是按照这种规范写法写,能解决大部分问题。有关返回一维数组的问题,我们有通用范式,如下:

img

  • (1) 这一句话一般是系统提示你,需要申请内存,并且返回申请内存的首地址;
  • (2) 这里会有两个返回值,一个是数组首地址(体现在返回值上),一个是数组大小(体现在指针传参上);
  • (3) 利用 malloc 申请一块自定义大小的内存;
  • (4) 做你要做的事情;
  • (5) 利用解引用,将需要返回的数组的长度告诉调用者;
  • (6) 返回申请的数组内存的数组首地址;

三、课后习题

课后所有习题,在上文都能找到答案,所以务必刷掉 三道 以上。 第四天了,感觉如何?如果指针已经理解,那么恭喜你,C语言的最难点就告一段落了,后面就是搭积木了。其实举办这个九日集训的目的,最终还是为了让大家养成习惯,习惯刷题并且爱上它,我相信,到了后面你自己也会忍不住自己找题来刷。 坚持!加油!你可以的!

重新排列数组 视频题解

数组串联

基于排列构建数组

一维数组的动态和

左旋字符串

IP 地址无效化

替换空格