导读
指针是什么?指针有什么用?为什么要学习指针???
指针
地址
运算符—&
作用为获得变量的地址(因此只能用于变量) &不能对没有地址的量取地址 例如
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
int *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
指针所指的数是const
表示不能通过这个指针去修改那个变量(但是不能使那个变量变成const) 表示方法
const int *p=&i
i=26
p=&j
*p=26
注
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))
在使用完后要进行free(a) 将空间还回去 如果没有空间将会申请失败,此时会返回一个NULL
内存释放函数
free 将申请的空间还给系统 注:申请过的空间都需要还,还时应还申请空间的首地址 常见问题 申请了没有free——长时间运行会使内存逐渐下降 free两次 地址发生改变后直接进行free
|