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

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


指针

  • 1、关于链表
  • 2、关于数组
    • 2、1、一维数组传参
    • 2、2、二维数组传参
    • 2、3、利用malloc创建二维数组
  • 3、指针类型的题目
    • 3、1、有关指针数组
    • 3、2、多种运用

1、关于链表

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

2、关于数组

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

2、1、一维数组传参

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

#include 
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、有关指针数组

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

3、2、多种运用

#include 
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;
}

这题可以好好想想,在下一次的文章里面我会写一下具体的解题过程,这题挺好的,多想想,会对理解有很大的帮助。
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=29wwhjd9s9s08

你可能感兴趣的:(寒假每日,算法)