C语言基础 指针的详细解析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、指针的基本概念
  • 二、指针变量的定义,赋值
  • 三、指针变量做函数参数
  • 四、数组的指针
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

指针是C语言的一个重要概念和特色,对于C语言的学习来说也是重点和难点。


提示:以下是本篇文章正文内容,下面案例可供参考

一、指针的基本概念

要学习指针和其特色,我们要明确几个基本的概念:地址  直接访问和间接访问

在C语言中,地址简单来说就是一串十六进制的数字,用于记录位置信息。而指针变量,就是存储了地址的变量。指针变量中所储存的就是变量的地址。当指针中储存着某个变量的地址时,我们也叫指针指向这个变量。

直接访问和间接访问是编程中访问变量的两种方式。直接访问是指通过变量名来访问值。而间接访问就是通过指针来访问变量的值。指针的间接访问,大大提高了C语言的灵活性并改善了程序性能。

 总的来说,指针就是存储了一段内存地址的变量。我们可以通过它,来对指针所指向数据的进行一系列的操作。既然指针也是一种变量,那么和其他变量一样,指针变量也占用一定存储单元。而且,指向不同类型变量的指针所占的存储单元也不同。(和其所指向的变量的存储单元相同)

二、指针的定义,赋值

指针的定义形式也十分简单,与定义变量类型相似。只需在变量类型和变量之间加上*(指针运算符,也叫间接访问运算符)来加以说明。在定义时即可赋值。

int a;
int *p=&a;//定义指针变量p,同时,将a的地址赋值给p。

&在C语言中有许多不同的含义。当它出现在变量的 头部,就代表取地址符。如 &a 就代表变量a的地址。

除了在定义时赋值以外,我们也可以通过赋值语句来给指针变量赋值,同样也是通过&。

int *p;
p=&a;

需要特别注意的是,在非定义指针变量的情况下使用*,代表指针变量所指向的变量本身。也就是说,我们可以通过指向变量的指针变量来改变被指向变量的内容。所以我们在非定义时利用赋值语句给指针赋值时,千万不要写成(*p=&a;)。因为此时的*p代表的是指针变量p所指向的变量,而此时我们并没有给指针赋值,也就是说指针此时指向的是我们不知道的未知变量,如果我们这样写,就把未知变量的值更改为了变量a的地址。不仅没有得到我们想要的效果,同时产生了一些未知的隐患。

int a=5;
int *p=&a;
*p=9;//此时变量a的值就被给变为了9。

既然*p在非赋值语句时就代表a,那么*p就也可以像变量a那样进行自增和自减运算。同时,*运算符,++运算符和&运算符的优先级相同。而且运算都是从右至左的。所以,(*p)++和*p++也就有所区别。(*p)++就代表a++,也就是变量a自加1。而*p++就代表p先执行后加加,再取地址。这里要强调的是,指针++运算,指针的指向就会发生改变。在内存空间中,每自加一次,指针就会跳过一个指针变量类型的变量,进而指向与原变量相邻的下一个类型相同的变量。所以,*p++代表的是,*p也就是变量a,然后p++,此时,指针p所指向的就变为了紧挨变量a的下一个int类型的变量。

三、指针变量做函数参数

当我们把指针变量或者地址作为函数实参传递到函数中时,形参的指针变量就会接收实参的值,进而指向主函数中的变量。那么,通过*,我们就可以在函数中对多个主函数中变量进行一定的影响。不过,我们依然要清晰地认识到,指针的实参与形参之间的传递依然是一种单向传递,也是一种值传递。改变形参指针变量的指向,并不会对实参的指针变量的指向造成影响。

#include<stdio.h>

void change(int *q){

*q=10;
q++;

}
int main(){
int a=1;
int *P=&a;
change(p);
printf("%d",a);
*p=7;
printf("%d",a);
}

以上代码两次printf的结果分别为10和7。在函数中,我们分别改变了*q和形参q的值,然后改变了形参的指向, 变量a的值立刻发生了改变,可见我们可以通过形参来改变主函数中的变量的值。而然后,我们在主函数中·通过指针p来改变a的值依然有效,可见函数形参的改变并不能影响到函数实参。

四、数组的指针

大家都知道,数组就是多个变量的众和,数组中各元素的地址是碍着的,数组名代表的是数组的首地址(数组a代表的是a[0]的地址)。那么如果我们把数组a的首地址赋值给指针变量p,那么就可以通过p来影响数组a的每一个变量。(p+i)就代表数组第 i 个元素的地址,也就等价于(a+i)。

同时p[ i ]也就等价于a[ i ]。那么我们就可以通过*(p+i)来对数组个个元素的值进行改变。需要注意的是,数组名不可以像指针那样进行++运算。也就是说,数组名必须指向数组首地址。最后,我们应明确数组指针和指针数组的区别,*和[ ]优先级相同,从右至左运算。*p[i]是数组的指针,代表的是有i个元素的数组的指针。而(*p)[i]代表的是数组指针,表示的是定义i个(下标从0到i-1)指针变量。当我们用*p[i]来定义数组指针时,与数组名不同,代表的是指向整个数组的指针,而非指向数组的首元素。


总结

指针复杂多变,细节入微。也是其魅力所在。

  • 37
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鬼多不菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值