指针详解

                                                                           指针总结

一.什么是指针?

首先,我们要弄清楚在C语言中数据在内存中时如何存储和读取的。当我们定义一个变量,对程序进行编译时,系统就会给这个变量分配内存单元。整形一般分配两个字节,浮点4个字节。当程序读取变量时,就会找到他们的内存单元地址,从而从内存中获得数据。而这个内存单元地址就是指针,其实总的来说指针就是内存地址。其符号是*;表示指向内存地址的意思。

例如

Int i=0;

Printf(“%d”,i);

当程序编译这段程序时,就会给变量i分配2字节的内存,同时将内存地址与变量绑定。假如分配了20012002两个字节的内存单元。

我们接着声明一个指针变量 ,并令这个指针变量指向I;

int *p;

p=&I;//符号&在此处是取地址的意思,当然他还有引用的意思

此时p的值就是2001,因为指针指向的是变量的开始内存地址。

Printf(“%d”,*p);

这是打印出指向内存2001地址单元的值,因为是整型指针变量,他会输出以2001开头的两个字节内的数据。

二.指针的使用

1.简单的使用

(a).声明一个指针变量。例如int *pointer_1;

(b).对变量pointer进行赋值,注意我们声明的int*pointerint * 都是来修饰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语言为何一直这么火,我觉得,指针技术就是原因,指针以上几点的作用,完全是程序开发的大脑。其效率也是其他语言所不能相比的。

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值