`
lighter
  • 浏览: 498613 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

心血来潮:重新温习一下C语言的指针

阅读更多
  近来几天白天有时候比较有空,所以就复习看看资料,这两天,有了重新温习一下C语言的干劲,于是就记录下来一些点滴。
  在计算机中,所有的数据都是存放在存储器中的.一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数是不等的,如整型量占2个单元,字符量占1个单元.为了正确地访问这些内存单元,必须为每个内存单元编上号即可准确地找到该内存单元,内存单元的编号也叫做地址。根据内存单元的编号中地址就可以找到所需的内存单元,所以也把这一个地址称为指针。
  严格地说,一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的指针的值,是变量。
  变量的指针就是变量的地址。存放变量地址的变量是指针变量。

  1、定义一个指针变量
  
int *p1;
   float *p2;

  注意一点,一个指针变量只能指向同类型的变量。

  2、指针变量的引用
  指针变是的赋值只能赋予地址,决不能赋予任何其他的数据,否则将引起错误。如:
  int a ;
  int *p = &a;
  或
  int a;
  int *p;
  p = &a;

  3、指针变量作为函数参数,举例:
  swap(int *p1,int *p2)
  {
   int temp;
   temp = *p1;
   *p1 =  *p2;
   *p2 = temp;
  }
  exchange(int *q1,int *q2,int *q3)
  {
   if(*q1<*q2) swap(q1,q2);
   if(*q1<*q3) swap(q1,q3);
   if(*q2<*q3) swap(q2,q3);
  }

  注意一点,在指针变量说明中,"*"是类型说明符,表示其后的变量是指针类型。而表达式出现的"*"则是一个运算符用以表示指针变量
所指的变量。
  如:
  int a,*pa = &a,*pb;
  pb = pa; /*把a的地址赋予指针变量pb*/


  4、指针变量的一些细节内容
  4.1、可以把数组的首地址赋予向数组的指针变量.如
  int a[5],*pa;
  pa = a;  /*这一句也可以写成 pa = &a[0]; */

  4.2、也可以把字符串首地址赋予指向字符类型的指针变量。
  例如:
  char *pc;
  pc = "C Language";

  当然也可以直接赋值啦:char *pc = "lighter.iteye.com";
 
  4.3、把函数的入口赋予指向函数的指针变量,如:
  int (*pf)();
  pf = function;  /*function为函数名称*/


  4.4 对于指向数组的指针变量,可以加上或减去一个整数n。设p是指向数组a的指针变量,则p+n,p-n,p++,++p,p--,--p的运算都是合法的。
  如:
  int a[5],*pa;
  pa = a;  
  pa = pa +2; /* pa 指向a[2],即pa的值为&pa[2] */ 



  5、数组指针
  看一个例子:
  int a[10];
  int *p = a;

  注意一下,p+i和a+i就是a[i]的地址,或者说它们指向a数组的第i个元素。
  *(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即a[i]。

  另外一点,指针变量可以实现本身的值的改变,如p++是合法的,而a++是错误的。因为a是数组名,它是数组的首地址,是常量。
  *p++,由于++和*同优先级,结合方面自右而左,等价于*(p++)

  6、数组名作函数参数,可以用指针的方式来实现
  float aver(float *pa);
  main(){
   float sco[5],av,*sp;
   int  i;
   sp = sco;
   for(i =0;i<5;i++) scanf("%f",&sco[i]);
   av = aver(sp);
   printf("%5.2f",av);  
  }
  
  float aver(float *pa){
    int i;
    float av,s=0;
    for(i=0;i<5;i++) s = s+*pa++;  
    av = s/5;
    return av;
  }

  再看一个例子,查看最大值与最小值的
  int max,min;
  void max_min_value(int array[],int n){
     int *p,*array_end;
     array_end = array + n;
     max = min = *array;
     for(p=array +1;p<array_end;p++)
        if(*p>max) max = *p;
     else if(*p < min) min = *p;
   return;
  }


  总结一个,如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参的对应关系有以下几种:
  I、形参和实参都是数组名
  II、实参为数组,形参为指针变量
  III、实参,形参都用指针变量
  IV、实参为指针变量,形参为数组名
 
  7、字符串指针变量
  举例,想要输入字符中N个字符后所有字符。
  main(){
    char * ps = "lighter.iteye.com";
    int n = 10;
    ps = ps + n;
    printf("%s\n%",ps);
  }

  再写一个例子,要求把一个字符串的内容复制到另一个字符串
  cpystr(char *pss,char *pds){
     while(*pds++=*pss++);  
  }

  注意一点,字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在该首地址为首的一块连续的内存空间并以
'\0'作为串的结束。字符数组是由于若干数组元素组成的,它可用来存放整个字符串。

  8、指针数组
  举例,定义一个指针数组:int *pa[3];

  9、指向指针的指针
  main(){
    char *name[] = {"lighter","javaeye","com","nice"};
    char **p;
    int i;
    for(i=0;i<4;i++){
      p = name + i;
      printf("%s",*p);
    }
  }












































 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics