指针小结

来源:互联网 发布:java mvc模式 编辑:程序博客网 时间:2024/04/24 08:30


一维数组与指针:

       1》数组名代表数组中第一个元素(即序号为0的元素)的地址。
       2》如果指针变量P已指向数组中的一个元素,则P+1指向同一数组中的下       

                一个元素(而下是将P值简单地加1);P+1所代表的地址实际上是            

                      P+1*d,d是一个数组所占的字节数。
       3》如果P的初值为&a[0],则:
          1。p+i,a+i,*(p+i),*(a+i),都等效于a[i]的地址
          2。指向数组的指针变量也可以带下标如:p[i]与*(p+i)等效;
             故而:引用一个数组元素,可以用:
               下标法:如形式a[i];
               指针法:如*(a+i)或*(p+i)。其中a是数组名,p是指向数组元素的                

                    指针变量。
        4》用数组名作函数参数

                   形式:f(int arr[],int n)或f(int *arr,int n)

              C语言调用函数时:当用变量名作为函授数参数时传递的是变量的                

              值;当用数组名作为函数参数时,由于数组名代表的是数组首元            

                素地址,因此传递的值是地址,所以要求形参为指针变量。
              实际上:C编译都是将形参数组名作为指针变量来处理的

        5》在C中字符间的短横杠要加shift键和横杠键才行,如:max_min_value


**数组与指针:
       
        如:int a[m][n]  (1=<i<=m;1=<j<=n)
            则:
               1:a[i]表示第i行首地址,即:a[i][0]的地址
                  a[i]+j表示第i行第j列的地址,即:a[i][j]的地址
               2:用指针的形式表示:
                   a[i]等效于:*(a+i)
                   a[i][j]等效于: *(a+i)+j
                   *(*(a+i)+j)或*(a[i]+j)表示a[i][j]值。
               3: int (*p)[n];p=a;

                   则:(*p)[i]  表示数组a的第i行的首地址,即:a[i][0]

                       *(*(p+i)+j)或*(p[i]+j)表示a[i][j]值


 字符串与指针:
           
           1》 C语言对字符串常量是按字符数组处理的,在内存中开辟了一个
               字符数组用来存储该字符串常量。对字符指针变量string的初始           

                化,实际上是把字符串第一个元素的地址(即字符数组的首元素地       

               址)赋给string.
              
               定义string的方式:

                       char *string="I love china!";
                 等价于:char *string;
                         string="I love china!";  
       
              说明:1。通过字符数组名或字符指针变量可以输出一个字符串;
                       但是,对一个数值型数组是不能企图用数组名来输出它的
                       全部元素的!
                    2。用%s可以对一个字符串进行整体输入输出。
      

           2》对字符串中字符的存取可以用下标法或用指针法
           3》字符数组和字符指针变量都能实现字符串的存储和运算,但二者有
              区别:
             (1)字符数组由若干个元素组成,每个元素中放一个字符;而指针            

      变量中存储的是地址(即:字符串第一个字符的地址),决不                 

     是将字符串放到字符指针变量中;   
             (2)赋值方式:对字符数组只能对各个元素赋值,或者是初始化;
                            对字符指针赋值见上面1》 。

             (3)指针变量的值是可以改变的,而数组名虽然代表地址,但它是             

       常量,其值不能改变。
             (4)用指针变量指向一个字符串,可以用它代替printf函数中的格           

         字符串。
                  如:
                      char *format;
                      format="a=%d,b=%f/n";
                      printf(format,a,b);
               
                  注:只要改变指针变量format所指的字符串,就可以改输入
                      输出的格式。这种printf函数称为可变格式输出函数。


指向函数的指针:
 
            1》用函数指针变量调用函数
             
               (1) 定义形式:
                      数据类型 (*指针变量名)(函数参数表列)     
     
               (2) 函数调用可以通过函数名调用,也可以通过函数指针调用。
                     而且,在一个程序中,一个指针变量可以先后指向同类型的       

               不同函数。
               (3) 在给函数指针赋值时,只需要给出函数名而不必给出参数。
                     如: p=max;//max为一个子函数;不能写成p=max(a,b);
                (4)  用函数指针变量调用函数时,只需将(*p)代替函数名即可                

      如:c=(*p)(a,b);
                注:对指向函数的指针变量,像p+n,p++,p--等运算是无意义的

             附一函数如下: (经调试过的) 

             #include<stdio.h>
             #include<stdlib.h>
             int main()
             {
                  int max(int,int);
                  int (*p)(int,int);
                  int a,b,c;
                  p=max;
                  scanf("%d,%d",&a,&b);
                  c=(*p)(a,b);
                  printf("a=%d,b=%d,max=%d/n",a,b,c);
                  system("pause");
              }

              int max(int x,int y)
              {
                  int z;
                  if(x>y)z=x;
                  else z=y;
                   return (z);
               }