C语言入门——指针

一.指针的定义

我们在scanf(“%d”,&i)中用&取得了i的地址,传进了函数中让计算机存储了i的值,能够进行后续的运算,而计算机有一种变量能够保存地址,那就是指针

1.指针,就是保存地址的变量。指针中储存了变量的地址,这个地址所指向的就是个变量(不能是具体的一个数值)例如:2.在编程中,指针变量通常作为函数中的形式参数,在函数调用时起传递值的作用

在进入函数f(int *p)后,我们通过改变*p就能使main()函数的变量i改变,也就是通过指针改变了一个变量的值,实现了值的传递。

二.指针的使用

在上面我们提到了指针在函数调用中能够实现值的传递,在一个子函数中改变指针上对应的数值,就可以改变主函数的值以及多个其他子函数中同一个变量的值,在大工程的编码中起着非常大的作用,在检查修改代码时提供很大的便利,下面我们通过一些具体的例子来感受指针的作用。

1.前面基础学习中,用到了swap函数来进行数的交换:

很显然在swap函数实现了数的交换,但是离开swap函数后a和b的值在main函数没有改变,那也就说明普通的变量是无法在函数之间传递数值的,而指针变量可以做到,也就是上面说到的值的传递:

在离开f()函数后,a和b的值发生改变,也就是指针在传递值时起到了作用,指针能够改变多个值。

2.在函数需要同时返回状态和结果时,指针就起到了很便利的作用。在前面的isprime()函数中我们需要返回一个1/0来判断是否为素数,而函数只能返回一个值,所以在当函数需要传回多个运算结果时就需要用到指针,下面我们看一道例题来理解一下该用处:

当b!=0时,divide()函数既完成了状态判断也实现了结果的传递;当b==0时,函数返回了状态判断但是没有进行运算。

3.指针与数组

数组变量本身表达地址,在函数参数表中实际上就是指针,在scanf()中就不需要用&取地址。

在向函数传入数组时,可以看到数组也可以通过在函数内发生改变从而改变main函数中对应的变量的值,与指针有着一样的作用:

可以看到在triple()函数中我们改变数组每个单元的值,在main函数中数组相应的值也发生了改变,就可以说数组实际上就是指针,只是在写法上稍有不同,下面就是用指针的形式定义了数组:

值得注意的是,数组是const的指针,不能进行赋值,即int a[ ] 等价于 int* const a.

三.指针的运算

1.初见指针运算

指针就是储存地址的变量,所以指针的加减运算是可以有意义的。

通过上述char和int两种类型的指针对比我们打破了传统的认知,+1之后的结果并不一定是+1,那是因为什么呢?

我们知道sizeof(char)=1,sizeof(int)=4,所以在对指针+1是要让指针移到下一个单元,而不同类型的变量一个单元所占的字节数量不同,这就是+1之后的结果并不一定是+1的原因。

2.指针运算在数组的使用

很显然在上面我们看到指针的运算是各个单元的加减,而在数组的学习中,我们也知道一个数组中有着有限个单元,实际上每个数组单元所占的内存就是对应类型的长度,下面利用简单数组理解

注意

a.*是单目运算符,优先级很高,所以不能书写为*a+1,要写成*(a+1).

b.++优先级高于*,所以可以写成*p++

四.动态内存分配

在C99之前,要想储存一个数组,需要向系统申请一个空间,不是现在直接用number[ ]的方式直接写入,而是用malloc函数获取一个空间。

https://blog.csdn.net/qq_42565910/article/details/90346236

五.使用指针时的易错点

1.定义了指针,但是还没有指向任何变量就开始使用。

2.用const定义了指针,但是后续进行了修改。

在编译报错处可以看到read-only的错误,说明我们在f()和g()函数中尝试改变了不能改变的变量,修改后我们可以看到const对于指针的作用如下:

3.指针中的0地址是无效地址,NULL表示0地址,返回的指针没有意义。

4.不同类型的指针不能互相赋值

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值