美文网首页
C语言指针

C语言指针

作者: Elijah_cs | 来源:发表于2019-07-08 14:21 被阅读0次

    在C语言中,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。指针是C语言的重中之重及精华的地方,所以我尽量多些代码来熟悉,看一个Demo:

    #include<stdio.h>
    int main()
    {
        int var1 = 10;
        char var2[10];
        printf("address of var1 is %p \n",&var1);
        printf("address of var2 is %p \n",&var2);
        return 0;
    }
    result:
    address of var1 is 00CFFD5C
    address of var2 is 00CFFD48
    

    什么是指针

    指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:

    type *var_name
    int *ip; //一个指向整型的指针
    char *ch; //一个指向char类型的指针

    所有实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,对应指针的值的类型都是一样的,都是一个代表内存地址的长的十六进制数。
    不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同

    如何使用指针

    使用指针时会频繁进行以下几个操作:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。看demo:

    #include<stdio.h>
    int main()
    {
        int var = 0;
        int \*pointer = &var; //得到变量var储存的地址
        printf("address of var is %p\n",&var);
        printf("address of var is %p\n",pointer);
        printf("data is %d\n",*pointer);  //*运算符为取出地址的内容
        return 0;
    }
    result:
    address of var is 00DBF95C
    address of var is 00DBF95C
    data is 0
    

    指针数组和数组指针

    看demo

    #include <stdio.h>
    const int MAX = 3;
    int main ()
    {
       int  var[] = {10, 100, 200};
       int i, \*ptr[MAX];  //指针数组
       for ( i = 0; i < MAX; i++)
       {
          ptr[i] = &var[i]; /* 赋值为整数的地址 */
       }
       for ( i = 0; i < MAX; i++)
       {
          printf("Value of var[%d] = %d\n", i, *ptr[i] );
       }
       return 0;
    }
    

    C语言没有字符串,可用数组,Demo:

    #include <stdio.h>
    const int MAX = 4;
    int main ()
    {
       const char *names[] = {
                       "Zara Ali",
                       "Hina Ali",
                       "Nuha Ali",
                       "Sara Ali",
       };//声明了一个字符串指针数组
       int i = 0;
       for ( i = 0; i < MAX; i++)
       {
          printf("Value of names[%d] = %s\n", i, names[i] );
       }
       return 0;
    }
    

    指向指针的指针

    指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置 pointer.PNG

    int **ptr; //ptr指向一个指针,该指针指向一个int类型的数据

    #include<stdio.h>
    int main()
    {
        int var = 100;
        int *ptr;
        int **pptr;
        ptr = &var;
        pptr = &ptr;
        printf("data of var is : %d\n",var);
        printf("data of prt is %p\n",ptr);
        printf("the data store in  prt is %d\n",*ptr);
        printf("data of pprt is %p\n",pptr);
        printf("the data store in  pprt is %p\n",*pptr);
        return 0;
    }
    result:
    data of var is : 100
    data of prt is 00D3FCC0
    the data store in  prt is 100
    data of pprt is 00D3FCB4
    the data store in  pprt is 00D3FCC0
    //可以看到,var的值为100,它存储的位置是00D3FCC0
    //ptr的值为00D3FCC0,它储存的位置是00D3FCB4
    //因此,可以通过pptr一步步链接找到vae的值
    //指针的指针即是指向指针的指针
    

    传递指针给函数

    C 语言允许您传递指针给函数,只需要简单地声明函数参数为指针类型即可。

    #include<stdio.h>
    void assignment(int *ptr); //接受一个指向int类型的数据的指针作为参数
    int main()
    {
        int var = 10;
        printf("before assignment: %d\n",var);
        assignment(&var);
        printf("after assignment: %d\n",var);
        return 0;
    }
    void assignment(int *ptr)
    {
        *ptr = 20;
    }
    result:
    before assignment: 10
    after assignment: 20
    //传递指针到函数是直接对地址进行操作,所以可以修改值
    //DEMO:传递数组给函数
    \#include<stdio.h>
    \#include<stdlib.h>
    void increase(int *ptr,int size);
    int main()
    {
        int Arr[3] = {0};
        int i = 0;
        printf("before increase\n");
        for(i= 0 ;i < 3;i++ )
        {
            printf("%d  ",Arr[i]);
        }
        increase(Arr,3);
        printf("\nafter increase\n");
        for(i= 0 ;i < 3;i++ )
        {
            printf("%d  ",Arr[i]);
        }
        system("pause");
        return 0;
    }
    void increase(int *ptr,int size)
    {
        int i;
        for(i = 0; i <size ; i++ )
        {
            *(ptr+i) =i;
        }
        return ;
    }
    result:
    before increase
    0  0  0
    after increase
    0  1  2
    

    函数指针

    函数指针是指向函数的指针变量。通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。函数指针可以像一般函数一样,用于调用函数、传递参数。
    函数指针变量的声明:

    datatype (*ptr) (datatype,datatype)

    #include<stdio.h>
    #include<stdlib.h>
    int max_n(int a ,int b)
    {
        if(a>b)
            return a;
        else
            return b;
    }
    int main()
    {
        int (* ptr)(int,int) = max_n; //指向max函数
        int a , b;
        a = 2;
        b = 4;
        printf("%d  ",ptr(a,b));//直接调用函数
        return 0; }
    

    ***回调函数

    函数指针作为某个函数的参数:函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。简单讲:回调函数是由别人的函数执行时调用你实现的函数。

    #include<stdio.h>
    #include<stdlib.h>
    int getNumber(void)
    {
        return rand();
    }
    int getNumber(int a)
    {
        return rand();
    }
    void GetArr(int *ptr,int size,int (*getNumber)(void)) //注意这里引用的格式
    {
        int i;
        for(i = 0;i<size;i++)
        {
            ptr[i] = getNumber();
        }
    }
    int main()
    {
        int data[10];
        int i = 10;
        GetArr(data,10,getNumber);
        for(i=0;i<10;i++)
        {
            printf("%d ",data[i]);
        }
        printf("\n");
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:C语言指针

          本文链接:https://www.haomeiwen.com/subject/plvohctx.html