原创 C语言小结——指针

2008-10-17 19:03 2104 1 1 分类: 软件与OS

题注:正确理解和运用指针是衡量是否成功地运用C语言编程的标准


     A:在函数调用过程中,运用指针可以十分灵活地修改函数中被调用的参量;


     B:指针可以用来支持C语言动态分配程序;


     C:可以提高某些程序的效率。


(1):指针是地址


         把指针仅仅看成是内存中的一个地址,第一个变量可以说成是指向第二个变量;


(2):指针变量


        【形式】:【类型 * 变量】定义指针可以指向的变量类型;


        【注】:如果一个变量包括指针,必须对它进行说明。


(3):指针运算符【*】【&】


       【*】:表示返回指针指向地址中变量的值;


       【&】:表示返回指针变量的内存地址。


        【注】:【*】与乘法运算符、【&】与位运算符相同,注意优先级关系,都比算术运算符的高,与一目减相同;指针变量必须指向正确的数据类型。


(4):指针表达式【特殊性】


         【1】指针的赋值


                   int x,*p1,*p2;


                   p1=&x;


                   p2=p1; 


         【2】指针的算术运算 【只有两种:加和减】


                  p--;p++;--p;++p;p=p-9;运算后结果是内存地址,所有指针都按照它所指向的数据类型的字节长度进行加和减,总是指向基本类型的相应元素。


                 不能进行其它运算:因为指针通常是以动态分配来确定的,在内存中是随机的,不是一个确定的值。


          【3】指针的比较


                    应用背景:常用于两个或两个以上的指针都指向同一个公共对象时;


                    例如:建立一个堆栈存储整型量的值,堆栈是一张“先进后出”存储表。


                    #include  "stdib.h"


                    int *p1*p2;


                    main()


                    {


                          int vlue;


                          p1=(int *)malloc(50*sizef(int));


                          if(!p1)


                             {


                                  printf("allocation failure\n");


                                  return;


                             }


                          p2=p1;


                         do{


                                 scanf("%d",&vlue);


                                 if(vlue!=0)  


                                     push(vlue);


                                else   printf("this is it %d\n",pop());


                              }while(vlue!-1);


                  push(int i)


                  {


                        p1++;


                        if(p1==(p2+50))


                            {


                                  printf("stack overflow);


                                  exit(1);


                             }


                        *p1=i;


                     }


                  pop()


                  {


                        if(p1==p2)


                            {


                                  printf("stack underflow);


                                  exit(1);


                             }


                        p1--;


                        return *(p1+1);//括号是必不可少的


                   }


}


(5):动态分配函数【给堆栈分配或释放空间】"stdib.h"


        【maloc】:分配内存并返回一个指向这个内存的字符型指针;必须有足够的剩余空间才可以分配;【void *malloc(num_bytes)】


                  【注】必须定义它的类型,以便指针转换成正确的类型;


          char *p;  p=(char *)malloc(1000);//p指向1000个字节的空余内存的首地址;


          int *p;     p=(int *)malloc(50 *sizeof(int));//使用sizeof来确定整型量所需要的字节长度。


                     由于堆的范围是有限的,因此当你分配内存时一定要检查由malloc所返回的值以保证在使用指针前,它的内存不为0;


                  if(!p=malloc(100))


                     {


                      printf("out memory.\n");


                      exit(1);


                    }     


         【free】: 释放原先所分配的内存,使它能重新分配;对象必须是事先分配过、有效的指针。【free(void *p)】

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
1
关闭 站长推荐上一条 /3 下一条