勤学如春起之苗,不见其增日有所长。 辍学如磨刀之石,不见其损日有所亏。 —— 陶渊明
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 = %dn", 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 = %dn", 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("%sn", ** cpp);
printf("%sn", *--* cpp 3);
printf("%sn", *cpp[-2] 3);
printf("%sn", cpp[-1][-1] 1);
return 0;
}
这题可以好好想想,在下一次的文章里面我会写一下具体的解题过程,这题挺好的,多想想,会对理解有很大的帮助。