原创 C指针温习(一)

2007-12-24 20:44 5059 9 10 分类: MCU/ 嵌入式

首先我们要记住的是:指针变量只能存放地址(指针),不要将一个整数(或者任何其它非地址类型的数据)赋给一个指针变量。比如:这里是不合法的:  pointer_1 = 10;  / pointer_1是指针变量,10为整数*/


    变量的指针就是变量的地址。存放变量地址的变量是指针变量,它用来指向另一个变量的。程序中的“*”就是指向的意思。比如:如果我们知道pointer_1是一个指针变量,则:


* pointer_1)就是pointer_1所指向的变量。


定义指针变量的一般形式是:


基类型  * 指针变量名;


基类型可以为int ,float等。它用来指定该指针变量可以指向的变量的类型。比如:


int * pointer_1中基类型int 的指针变量pointer_1只能用来指向整数的变量。而不能指向浮点变量。


定义指针变量时要注意两点:


1、指针变量前面的“*”表示该变量的类型为指针型变量。指针变量名为pointer_1 ,而不是 * pointer_1这是与定义整型浮点型的形式是不同的。


2、定义指针变量时必须指定基类型。因为不同类型的数据在内存中所占的字节数是不同的。比如:整型占两个字节,字符型数据占一个字节。在指针的移动和指针的运算中,比如:“使指针移动一个位置”或者“使指针值加<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />1这个一代表什么?如果指针指向一个整型变量,那么“使指针移动一个位置”就是移动两个字节,“使指针值加1就是地址加两个字节。如果这个指针是浮点型的,那么就是四个字节了。所以必须指定基类型。


下面对“&”和“*”再说明一些要点:如果已经执行了语句:pointer_1 = &a;


1、那么&* pointer_1的含义是什么?我们知道,“&”和“*”两个运算符的优先级别相同,而且是从右到左的方向结合。所以先进行* pointer_1运算,那么它就是变量a,再执行&运算,我们知道,它的意义是取地址,那么&* pointer_1&a相同,即变量a的地址。2、那么*&a的含义是什么呢?我们知道先进行&a运算,得到a的地址,再进行*运算,即&a所指向的变量,也就是变量a*&a* pointer_1的作用是一样的。都等价于变量a3         * pointer_1++相当于a++。注意,这个括号是必须要加的,如果没有括号的话,那么就成为了* pointer_1++,因为++*同一优先级别,结合方向从右向左,因此它相当于了:      *pointer_1++)。由于++pointer_1右边,是后加。因此先对pointer_1的原值进行*运算,再使pointer_1的值改变,这样的话pointer_1不再指向a了。


另外,我们看一个例子:我们需要对输入的两个整数按大小顺序输出:


#include


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


void main()


{


    void swap(int * p1,int * p2);


    int a,b;


    int * pointer_1,* pointer_2;


    scanf("%d,%d",&a,&b);


    pointer_1 = &a;


    pointer_2 = &b;


    if( a


    printf("\n%d,%d\n",* pointer_1,* pointer_2);


    getch();


}


 


void swap( int * p1,int * p2)


{


    int  p;


    p = p1;


    p1 = p2;


    p2 = p;


}


这个程序能不能成功呢?可能作者的设想是:先使pointer_1指向apointer_2指向b;再调用swap函数,将pointer_1的值传给p1, pointer_2的值传给p2;再在swap函数中使p1p2的值交换;最后形参p1p2将地址传回实参pointer_1pointer_2。如果输入23,那么预想的输出是“32”但是事实上不可能的。输出仍然是“23”。


因为C语言中实参变量和形参变量之间的数据传递是单向的“值传递”的方式。指针变量作函数参数也要遵循这一规则 。不可能通过调用函数来改变实参指针的值,但是可以改变实参指针变量所指变量的值。而函数的调用可以也只可以得到一个返回值,而运用指针变量作参数,可以得到多个变化了的值,如果不用指针的话是难以做到这一点的。


所以我们应该将swap函数改成这样即可:


void swap( int * p1,int * p2)


{


    int  p;


    p = *p1;


    *p1 = *p2;


    *p2 = p;


}


总结:如果想通过函数调用得到n个要改变的值,可以这样:


1、  在主调函数中设n个变量,用n个指针变量指向它们;


2、  然后将指针变量作为实参,将这n个变量的地址传给所调用的函数形参;


3、  通过形参指针变量,改变该n个变量的值;


4、  主调函数中就可以使用这些改变了值的变量。

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

wqd520 2008-6-22 00:35

很好,学习一下~~~
相关推荐阅读
daiqiumiao_806246054 2011-01-06 13:57
linux下yum代理设置
    我们在安装好linux后,经常会使用yum来更新系统,但是系统默认的代理是国外的,国内一般的网络不能访问,这里讲解具体做法,把代理换成国内的。attachment download      ...
daiqiumiao_806246054 2010-12-30 09:48
【转】ORACLE 10g下载地址
Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Microsoft Windows (32-bit...
daiqiumiao_806246054 2010-11-29 11:06
找工作的进来看
如下是我所有的开放性问题回答,希望对大家有帮助!1.      When choosing your first job/employer, what will you consider and wh...
daiqiumiao_806246054 2010-11-29 09:47
中长期规划---螺旋式上升方式修改完善职业之路
一、中长期职业发展的自我准备1、心态上随时做好准备 机会是给有准备的人的------“有准备”是你在做准备的过程中让“别人”认为你“有准备”!别人是包括你现在的老板和别的老板,以及你身边的人!他们对你...
daiqiumiao_806246054 2010-03-17 21:26
移动
分集方式传输损耗和距离关系光纤网络G网...
daiqiumiao_806246054 2010-03-17 09:40
GSM
特点  使用直观  GSM系统有几项重要特点:防盗拷能力佳、网络容量大、手机号码资源丰富、通话清晰、稳定性强不易受干扰、信息灵敏、通话死角少、手机耗电量低。  技术特点  1.频谱效率。由于采用了高效...
EE直播间
更多
我要评论
1
9
关闭 站长推荐上一条 /3 下一条