前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >寒假每日提升(3)[指针]

寒假每日提升(3)[指针]

作者头像
薛定谔方程难
发布2024-01-23 16:22:18
840
发布2024-01-23 16:22:18
举报
文章被收录于专栏:我的C语言我的C语言

勤学如春起之苗,不见其增日有所长。 辍学如磨刀之石,不见其损日有所亏。 —— 陶渊明

1、关于链表

这我就不再多说,大概看一下这篇文章搞明白

2、关于数组

在使用指针的时候,我们常常会与数组传参相联系,然而数组传参的多种形式让我们不知道该怎么去解决。 下面是我对于数组传参的理解,可能有错的,那么请在下面的评论区简单的说明一下。

2、1、一维数组传参

首先,我们知道一个函数叫做sizeof,可以看一下之前我有关于这个的介绍,要是不明白的话,那我们既然知道sizeiof的含义,那么我在做一件事情,请看下面代码

代码语言:javascript
复制
#include <stdio.h>
void test(int arr[])//或者是void test(int* arr)都是可以的。
{
 int sz2 = sizeof(arr)/sizeof(arr[0]);
 printf("sz2 = %d\n", sz2);
}
int main()
{
 int arr[10] = {1,2,3,4,5,6,7,8,9,10};
 int sz1 = sizeof(arr)/sizeof(arr[0]);
 printf("sz1 = %d\n", sz1);
 test(arr);
 return 0;
}
在这里插入图片描述
在这里插入图片描述

所以不难想到,由于我们在main函数中,传入的只是一个arr,那在数组中arr表示什么?当然不会是整个数组,反而只是数组的首元素的地址,那也就是说,在test函数中数组传参的本质是传递数组首元素的地址。 所以在test函数的新参的表示形式,那两个种都是可以的,既可以是写成数组形式,也可以写成指针的形式。

2、2、二维数组传参

由于一维数组传参的形式,可以根据第一种方式,就是直接是arr[r][c](或者是arr[][c],==行可以不写,但是必须要写列,==也就是相当于一维数组中的arr[]的这种形式)这种形式写成函数中的形参。这是第一种写法。 关于第二种写法,也是对于一维数组上的衍生,传一个二维数组的数组名,相当于是表示第一行的地址,是一维数组的地址,又根据传参的实参的第一行是什么类型,来决定是什么样子的数组指针。又想到数组指针了,还是得多看看之前写的。那么形参就可以写成是 int(*)[5]。还是那句话,二维数组的传参本质上也是传递了地址,传递的地址是一维数组的地址。

2、3、利用malloc创建二维数组

大体上的内容是这篇文章的代码,关键是这么理解呢?由于之前第一篇没有过多完善,所以在这,来解释。在看了前两个的数组传参,知道本质是地址。那么创建一个二维数组也就不会那么困难了。 首先,正是因为二维数组,所以我们采用二级指针,来指向我们的一级指针,一级指针就是我们的一维数组。malloc出来一个二级指针,二级指针的大小是根据目标的二维数组的行数来决定。在每一个二级指针的解引用的情况下,每一个下标,再次解引用,再malloc出来一个列数的一级指针。然后再次解引用,就可以通过malloc的二维数组进行赋值。

3、指针类型的题目

3、1、有关指针数组

有关于指针的计算其实也挺难的。

在这里插入图片描述
在这里插入图片描述

答案:A。因为s是一个指针数组,存放的都是每个字符串的首元素的地址,所以当ptr这个同样是指针数组的,只不过是二级指针(因为s直接写上去就是相当于是地址,一级指针地址,当然要用二级去接受了啊),每一个存放的相当于是把s的元素倒着存了一边,然后三级指针=ptr(地址),由于优先级*(这里是指针的,而不是加减乘除的)比+更高,所以是先解引用两次得到pink,然后加上1的话,就是跳过第一个字节,然后最后的结果就是 ink。

3、2、多种运用

代码语言:javascript
复制
#include <stdio.h>
int main()
{
 char *c[] = {"ENTER","NEW","POINT","FIRST"};
 char**cp[] = {c+3,c+2,c+1,c};
 char***cpp = cp;
 printf("%s\n", **++cpp);
 printf("%s\n", *--*++cpp+3);
 printf("%s\n", *cpp[-2]+3);
 printf("%s\n", cpp[-1][-1]+1);
 return 0;
}

这题可以好好想想,在下一次的文章里面我会写一下具体的解题过程,这题挺好的,多想想,会对理解有很大的帮助。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-01-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、关于链表
  • 2、关于数组
    • 2、1、一维数组传参
      • 2、2、二维数组传参
        • 2、3、利用malloc创建二维数组
        • 3、指针类型的题目
          • 3、1、有关指针数组
            • 3、2、多种运用
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档