目录
Part One:感悟
没感悟。(偷懒)
Part Two:Knowledge
引言:学习C语言的时候,我们都知道,指针=地址。同时我们也学习了指针相关的操作,但是,指针貌似还有更多的应用,还有相当大的一部分的知识我们没有学习。本文则聚焦于指针的进阶内容。我们
臭不要脸环节:如果你在看完了文章觉得本篇文章还行,不妨给作者点一个免费的赞,如果关注的话那就更好啦!
1.字符指针
我们在指针学习的过程中肯定知道“字符指针”这个东西。如以下代码所示。
char str = ch;
char *p = &str;
但是,如果str变成了一个字符串,那此时的p究竟存放的是什么呢?
char str = "hello bit.";
char *p = &str;
但是实际上当我们打开调试界面进行调试的时候,不难发现此时p里面存放的是str的首字符的地址。
为了加深理解,我们来看一道有趣的面试题~
#include <stdio.h>
int main()
{
char str1[] = "hello bit.";
char str2[] = "hello bit.";
const char *str3 = "hello bit.";
const char *str4 = "hello bit.";
if(str1 ==str2)
printf("str1 and str2 are same\n");
else
printf("str1 and str2 are not same\n");
if(str3 ==str4)
printf("str3 and str4 are same\n");
else
printf("str3 and str4 are not same\n");
return 0;
}
那么执行结果是什么呢? 我们执行一下,发现得到的结果会和下面图片相同。
第一行的“str1 and str2 are not same” 非常好解释,虽然两个字符数组的内容是一样的,但是他们在内存中存放的地方显然是不一样的,所以这个时候自然会打印“str1 and str2 are not same”的结果。
但是第二行的“str3 and str4 are same”又如何解释呢?依据前文,str3和str4里均存放着字符串“hello bit.”中h的地址,同时还加入了const进行修饰,那么str3和str4中存放的东西是一样的,切不能指向其他内容,那么对于编译器显然不需要用两个不同的指针去指向同一个内容。所以就会打印“str3 and str4 are same”的结果。
2.数组指针
在指针的学习中,我们知道指针数组是一个偏正短语,他实际上是个数组,但是用于存放指针。
那么把数组和指针的位置调换,我们就能得到另一个偏正短语-数组指针,那么我们知道了他是指针,那么他有什么用呢?
整形指针是指向整形数据的指针,浮点型指针是指向浮点型数据的指针。那么我们依葫芦画瓢,数组指针就是指向数组的指针!
事实也的确如此,那么,这玩意应该怎么写出来呢?
int *p1[10]; //A
int (*p2)[10]; //B
那么A、B分别是什么呢?
这里我要教大家一个很好用的方法,用于观察很多很复杂的代码,以便面对各种各样的精(sang)彩(xin)绝(bing)伦(kuang)的小题目。
观察A p1是变量名,同时后面跟上了[],那么p1就是数组,剩下的部分是他的类型!
观察B p2由于在括号里,优先级最高,所以p2就是指针,剩下的部分是他的类型!
所以,这个好用的方法就是先观察变量名,再去找变量名周围的操作符来判断p2的本质是个啥,剩下的就是他的类型啦!
依照我们的分析结果,不难发现p1是指针数组,而p2就是我们的数组指针。我们不妨把它换一个写法,来清晰地理解一下。
int[10] (*p2)
那么按照这样的写法,我们就能知道,p2就是指针,它指向一个int类型,有十个元素的数组。
但是我们编程时不能这么写,这不符合我们数组指针的写法捏。(虽然他更好观察)
可是我们又会遇到一个问题,那就是我有了数组指针,数组的地址我应该怎么取用呢?
int arr[10] = {0};
int (*p2)[10] = &arr;
这里的&arr代表整个数组的地址,但是如果你把它打印出来,他只会打印首元素地址哦~
那么数组指针的使用场景就是你可以用数组指针来接受二维数组的传参。
3.函数指针
那么,既然数组指针都出来了,函数指针相比也不奇怪,那么他依旧是指针。
写法呢,就像下面一样。
void (*pfun1)()
依次是 函数的返回类型 (*变量名)(参数的类型)
剩余内容请移步指针进阶(下)