人无完人,如果我写的文章有什么疏忽、错误或者缺漏,非常欢迎各位在评论区里斧正,在此感谢您观看本篇文章!
在开始c语言指针学习以前,我们需要了解几个概念。
1-----“指针变量”指的是存储地址值的变量,一般可以简称为指针。实质就是一个变量,可以存储不同的地址值(也就是指针)。
2-----“指针”指的是地址值。
3-----“取地址运算符”--’&‘,这个符号的作用,就是得到某个量的地址。你可以理解成,在一间大公寓里,每一个房间都是一个“地址”,在里面住的人,就是这个“地址”对应的量,而你是这间公寓的主人,你可以通过这个“地址”,来改变在里面居住的人。
4-----“指针运算符”--’*‘,这与取地址运算符恰好相反,就像数学中的乘与除、积分与求导一样,同样可以用公寓的例子来理解,‘&’就是你可以通过“地址”来改变或找到里面的人,而’*‘就是你同样可以通过里面的人来找到地址。
以上几个概念要重点掌握,其它细琐的库函数什么的就不在这里讲解了。(当然了,如果你需要的话可以在评论区留下你的疑问,只要我有时间和能力,都会尽量完成的)
由于指针就单单概念来说非常难以理解,所以我将结合以下3个示例进行讲解。如下:
1---
int main(void){
int *p;
//定义一个指向整型的指针(变量)p
int a = 10;
//定义一个整型变量
p = &a;
//将 a 的地址值赋予 p;
//以下是打印输出
printf("%d", p);
printf("%d", &a);
//以上的输出结果是一样的,都是a的地址值
printf("%d", *p);
printf("%d", a);
//以上的输出结果也是一样的,都是a存储的值---10
}
上面的例子,是指针最基本、最实在的应用之一。你可以将其理解成之前“喊你回家吃饭”例子的进阶版,小明妈妈想喊小明吃饭,除了直接叫小明的名字(a)外,还可以通过他的好朋友(p)来间接地喊小明。当然了,妈妈肯定不能直接说:“吃饭咯!”这样有可能会让(p)误以为是在叫他吃饭,妈妈得给(p)一个指令-----*(记录成*p),这样就明确而且能达到效果了。
2---
int main(void){
int *p;
int a = 5;
p = &a;
//上述代码同理
printf("%d", a);
//打印a存储的值,此时是5
*p = 10;
//通过p来改变a存储的值
printf("%d", a);
//打印,此时是10;
}
上述示例,是通过指针改变原来的值。同样可以通过上述例子来理解。把小明的状态(现在做的事)看成一个常量,那么妈妈可以通过小明的朋友p来观察小明的状态(即知道小明在做什么),这是上述例子想要表达的意思。当妈妈看到小明一直在玩电脑游戏,心中不满,想要让小明去读书时,妈妈既可以直接叫小明去读书,也可以通过小明的好朋友p来让小明去读书,自然地,为了让p更清晰他要作什么,你还是要给他加上一个指派符号---*(写作*p)。
看到这里你应该已经明白了,指针一般就是用来 获取 或者 改变 指针所指向的内容。因为它可以间接改变、间接引用其它值,程序就有了极大的扩展性。
我们接着讨论。
当然了,有的时候妈妈并不知道小明在哪里,或者说在妈妈的视野里,是没有小明、只有好朋友p的。这时候,妈妈就不能直接找小明,只能通过p了。这就涉及到了指针的核心内容之一----在一个函数里引用指针,来改变其它函数里定义的局部变量的值。
我们都知道,一个局部变量只能在它的作用域里作用,如果超出了它的作用域,那么你就无法直接调用它。例如,在主函数main里定义的整型变量i,在某个你定义的函数 fx 中无法发挥作用,如以下代码,就是完全错误的:
void ali(){
printf("%d", i);
}
//定义了一个函数ali
//要实现的功能是,将i打印出来
int main(void){
int i = 10;
ali();
//定义一个整型变量
//并赋值为10;
}
//运行结果:给ali报错
//称不存在i
当然了,你如果说定义参数并传i过去,这时候就可以打印i,但是在不引用指针的情况下,就不能在ali函数中改变i的值。所以,我们将要使用指针来进行调用。
话不多说,看如下代码:
void ali(int* p){
printf("%d\n",*p);
//通过指针了解i的值
*p = 100;
//通过指针改变i的值
}
int main(void){
int i = 10;
ali(&i);
//调用ali函数,将i的地址传过去是因为
//p是一个整型指针,存储的是地址
printf("%d", i);
//在运算结束后,打印i的值
}
//运行结果:
//10
//100
指针的基础内容大致就是这些,这里就不再赘述,如果有什么疑问或者建议,欢迎在评论区留言。