关于C语言的学习小结(8)———指针

导读

指针是什么?指针有什么用?为什么要学习指针???

指针

地址

运算符—&

作用为获得变量的地址(因此只能用于变量)
&不能对没有地址的量取地址
例如

scanf("%d",&(i++))//错误的
scanf("%d",&(i+b))//错误的

常用于是scanf运算符内

scanf("%d",&i)

在三十二位的架构下为4个字节
在六十四位的架构下为8个字节
注%p可以输出地址,并且以十六进制的形式输出(0x)

printf("%p\n",&i)

变量在堆栈(stuck)中储存,储存方式为自上而下,先储存的在上面,后储存的下面。

指针

作用:
保存地址的变量(其值为变量的地址)
形式:

int* p
int *p//与上式相同
int* p,q//p为指针,q不是
int *p,q//p为指针,q不是

普通变量的值为实际的值
指针变量的值为有实际值的普通变量的地址的值

运算符——*

*是一个单目运算符,用来访问指针的值所表示的地址上的变量。(与&相反)其既可以作左值,也可以作右值

指针的作用

可在函数中用指针变量改变函数外变量的值。
例如交换两个变量的值

void swap(int *a,int *b)
int t=*a
*b=*a
*b=t

函数返回多个值(因为函数最多只能返回一个值,所以需要返回多个值时,需要使用指针)
让函数返回特殊的不属于有效范围内的值来表示出错(0和-1)

不能定义指针变量后,没有指向任何变量就开始使用指针。

数组

参数表中的数组实际上是指针
数组变量本身表示地址,所以不需要使用&
数组的单元是变量,需要使用&
[]既可以对数组用,也可以对指针用
*既可以对指针用,也可以对数组用
数组变量是const的指针,不能被赋值

常量

const

const是一个修饰符,加在变量前,意味着变量不能被修改

指针是const

表示其一旦得到了某个变量的地址,就不能再指向其他变量。
表示方法

int *const q=&i//q是const,q的值不能被改变
指针所指的数是const

表示不能通过这个指针去修改那个变量(但是不能使那个变量变成const)
表示方法

const int *p=&i
i=26//可以
p=&j//可以
*p=26//不可以,*p是const,不能改变

const在*前为指针所指的数

const在*后为指针

转换

一个非const的值可以转换成const(常用于结构中,以防止函数对外面的变量进行修改。如果传递的参数类型比地址大时,可以用较少的字节传递值给参数)

const数组

在数组前加const,意味数组中的每一个元素都是const,因此在定义const数组时就应该全部进行初始化来进行赋值
作用:
可以用来保护数组
因为将数组传入函数时,传入的是地址,所以函数可以修改数组的值,如果设置参数const,可以保护数组的值。

int sum(const int a[]int

运算

指针计算

指针是可以进行+,-,++,–的运算的。+1意味着下一个数据(而不是地址上加一,例如int型的地址为+4。因为int的字符大小为4),同理-1意味着下一个数据。
两个地址可以进行相减。相减以后为之间的数据个数多少(不是地址的)
*p++
取出p所指的数据,并将将p移动到下一个位置
常用于数组

if(P=~;*P~~;*P++)
{
……
}

注:*p++的运行可以更快

指针比较

指针可以进行<,>,<=,>=,!=,==
地址是线性递增排列的

0地址

内存中有0地址,但0地址不能随意的触碰,因此指针不能指向0
但是0地址有一些特殊的事情,如让返回的指针无效化,让指针没有被真正初始化
有的编译器中不能用0来代表0地址,要用NULL

类型

指针有不同的类型,但不同类型的字节数相同,指的都是地址。同时不同类型的指针不能互相赋值
void表示不知道指向什么东西的指针
计算时与char
相同,但两者并不相同
指针也可以进行转换类型,转换后指针所指的变量的类型并未改变

内存

内存分配函数

malloc
可以向系统申请空间
参数类型

malloc(size-t size)

返回形式

void*//输出时需要转换类型

头文件

#include<stdlib.h>

使用

a=(int*)malloc(number*sizeof(int))//a既可以是指针,也可以是数组。int*是进行类型转换,number是数量,sizeof(int)是int的字节数,number*sizeof(int)是内存的大小

在使用完后要进行free(a)将空间还回去
如果没有空间将会申请失败,此时会返回一个NULL

内存释放函数

free
将申请的空间还给系统
注:申请过的空间都需要还,还时应还申请空间的首地址
常见问题
申请了没有free——长时间运行会使内存逐渐下降
free两次
地址发生改变后直接进行free

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值