指针总结
一.什么是指针?
首先,我们要弄清楚在C语言中数据在内存中时如何存储和读取的。当我们定义一个变量,对程序进行编译时,系统就会给这个变量分配内存单元。整形一般分配两个字节,浮点4个字节。当程序读取变量时,就会找到他们的内存单元地址,从而从内存中获得数据。而这个内存单元地址就是指针,其实总的来说指针就是内存地址。其符号是*;表示指向内存地址的意思。
例如
Int i=0;
Printf(“%d”,i);
当程序编译这段程序时,就会给变量i分配2字节的内存,同时将内存地址与变量绑定。假如分配了2001和2002两个字节的内存单元。
我们接着声明一个指针变量 ,并令这个指针变量指向I;
int *p;
p=&I;//符号&在此处是取地址的意思,当然他还有引用的意思
此时p的值就是2001,因为指针指向的是变量的开始内存地址。
Printf(“%d”,*p);
这是打印出指向内存2001地址单元的值,因为是整型指针变量,他会输出以2001开头的两个字节内的数据。
二.指针的使用
1.简单的使用
(a).声明一个指针变量。例如int *pointer_1;
(b).对变量pointer进行赋值,注意我们声明的int*pointer中int 和* 都是来修饰pointer的,说明pointer是个整形的指针。
Int a=10;
Pointer_1=&a;
(c)输出指针的值
Printf(“%d”,*p);
从此可以看出当我们声明int *pointer=1时;与int a=1是相同的
2.数组与指针
大家都知道,数组时有若干个元素的集合,一个变量有地址,数组同样有地址,指针可以指向变量,也可以指向数组元素,而指向数组元素的指针就是数组元素的地址。得到数组元素的地址可以用下标法a[3],可以用指针法*(a+3),而使用指针法占内存少,速度快,因为下标法a[3]在编译时还是要转换成*(a+3)
(a).对指针变量赋初值。
Int *p;
Int a[3]={1,2,3};
P=&a[0];
也可以用P=a;
3.多维数组与指针
多维数组,其实就是数组的数组。这句话如何解释是很重要的,例如,我们声明一个两行三列的数组a[2][3]={{2,3,4},{5,3,7}}
其实就是一个有两个元素的一维数组,而每个元素都是包含三个元素的一维数组
这样说还是有点不明白,列出来就好看一些了
a[0]:{2,3,4}
a[1]:{5,3,7}
这样我们就可以知道要读取一行一列的数据,其实就是取第一个元素的第一个数值。
下标法表示为a[0][0],同理用指针来表示是*((a+0)+0).联合取值就是*(a[0]+0)。
4.指针作为函数参数
当指针作为函数参数时,我们传递的是变量的地址,如果我们直接用变量做为参数时,由于是值传递,在函数里面对变量进行的操作是不会影响实参的值,也就是说,当我们函数完成后,变量的值并为发生改变。而使用指针作为参数时,当我们对变量值*p进行改变后,函数完成后,变量的值就发生了变化,而由于传递的指针是形参,它们的值是不会改变的。
由此,我们可以实现编写一个大小排序的函数
Void(int *p1,int *p2)
{
If(*p1<*p2)
{
Int temp;
Temp=*p1;
*p1=*p2;
*p2=temp;
}
}
三.指针的作用
应该说指针式c语言的精髓,也是c语言最大的特点,它实现了程序直接访问内存,并通过操作内存增强了程序的灵活性。
1. 由于在程序编译时,使用指针直接访问内存,避过了编译变量后找到内存这一步骤,提高了程序的效率。
2. 通过指针作为函数的参数,我们可以再函数里对原来变量值进行修改,在调用函数式变量改变了的值能够为主调函数所用。即可以从函数调用中得到多个可改变的值。
3. 最经典的应该就是实现动态存储分配了吧。在c语言中程序等于:数据结构+算法。
有一门课程就是数据结构,里面包含了链表,队列,二叉树等数据结构,而他们的实现都是用指针实现内存单元的动态分配,从而实现对数据的存储。我们使用的数据库,其实也是一种数据结构,其原理就是使用数据结构存储数据,然后保存。
总而言之,指针式c语言的精髓,c语言为何一直这么火,我觉得,指针技术就是原因,指针以上几点的作用,完全是程序开发的大脑。其效率也是其他语言所不能相比的。