美文网首页
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语言05- 指针

    C语言05- 指针 13:指针 指针是C语言中的精华,也是C语言程序的重点和难点。 13.1:指针定义与使用 指针...

  • 02-C语言的指针

    02-C语言的指针 目标 C语言指针释义 指针用法 指针与数组 指针与函数的参数 二级指针 函数指针 指针在C中很...

  • C语言指针总结大学霸IT达人

    C语言指针总结大学霸IT达人 C语言的指针是C语言区别其它语言的最主要的特定之一。有了指针,C语言就可以抛开所有束...

  • 带小白学C语言指针

    C语言里指针才是C语言的开始和指针;C语言里基本所有东西都是由指针演变而成; 指针是指向地址的变量,类型就是指针...

  • 在Swift中使用C语言的指针

    在Swift中使用C语言的指针 在Swift中使用C语言的指针

  • [Swift]结构体指针操作

    C语言的指针操作 在c语言中申明一个变量并通过指针修改该变量的值 a value is 2 c语言操作结构体指针操...

  • Go语言-指针

    Go语言中的指针不同于C语言,Go语言的指针使用方法要简单很多。当然和C语言从指针定义到指针的使用都有很大的不同。...

  • C语言中的指针与数组

    C语言中的指针与数组 @(C语言)[排序算法, 快速排序, C实现] 引言 相信指针与数组是不少同学在初学C语言时...

  • 指针数组和数组指针

    指针数组|存储指针的数组 在C语言和C++语言中,数组元素全为指针的数组称为指针数组。 例如:int *p[10]...

  • iOS开发 -- C语言基础8(指针)

    iOS开发 -- C语言基础8(指针) 指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很...

网友评论

      本文标题:C语言指针

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