• C语言——什么是指针?


    去年学C语言课时,初步了解了指针的概念,能看懂一些简单的含有指针的程序,但事实上对于指针并没有真正的弄明白它的使用,这点我在半年后的数据结构课程上才深刻的体会到和别人的差距。更加可怕的是,对于当时所得的一知半解,现在已经忘的八九不离十了,所以决定进行C语言核心部分的重修,巩固自己的基础。

    1.什么是指针?

    定义一个变量,系统会为它分配内存单元,内存区的每一个字节有一个编号,即“地址”。

    我们可以通过地址找到所需的变量单元,即:地址指向该变量单元。而这个地址便被形象化的称为“指针”。即:一个变量的地址称为该变量的指针。

    2.什么是指针变量?

    定义一个变量,专门用它来存放另一个变量的地址,这个变量被称为指针变量。指针变量的值是地址(指针)。

    3.指针变量的定义。

    int *p;//类型名 * 指针变量名;

    ***注意:指针变量p前面的*,指针运算符,表示的是“指向”,表示该变量的类型为指针型变量。在定义指针变量时必须指定基类型。

    int a,b;
    int *p1,*p2;//定义两个指向int的指针变量p1,p2 
    p1=&a;//a的地址赋给指针变量p1 
    p2=&b;//b的地址赋给指针变量p2 

    ***注意:&,取地址运算符,&a是变量a的地址

    4.指针变量的引用。

    *p1=100;//将100赋给p指向的变量,即变量a=100 
    printf("%d",*p1);//输出a的值
    printf("%o",p1);//输出a的地址 

    ***注意:*p1指,指针变量p1指向的变量,即整型变量a。

    5.指针的使用。

    例1:输入a和b两个整数,按先后大小的顺序输出a和b的值。

     1 #include <stdio.h>
     2 int main()
     3 {
     4     int *p1,*p2,*p,a,b;
     5     printf("请输入两个整数:");
     6     scanf("%d,%d",&a,&b);//输入数字时一定要使用英文状态下的逗号, 
     7     p1=&a;
     8     p2=&b;
     9     if(a<b)
    10     {
    11         p=p1;
    12         p1=p2;
    13         p2=p;
    14     } 
    15     printf("a=%d,b=%d
    ",a,b);
    16     printf("max=%d,min=%d
    ",*p1,*p2);
    17     return 0;
    18 }

    例2:swap()函数实现交换两个变量的值。

     1 int main()
     2 {
     3     void swap(int *p1,int *p2);
     4     int a,b;
     5     int *pointer_1,*pointer_2;
     6     printf("please enter a and b:");
     7     scanf("%d,%d",&a,&b);
     8     pointer_1=&a;
     9     pointer_2=&b;
    10     swap(pointer_1,pointer_2);//swap(a,b)是错误的
    11     printf("a=%d,b=%d
    ",a,b);
    12     return 0;
    13 }
    14 void swap(int *p1,int *p2)
    15 {
    16     int temp;
    17     temp=*p1;//传a值
    18     *p1=*p2;//传b值
    19     *p2=temp;
    20 }

    swap函数的两个形参p1和p2是指针变量,实参pointer_1和pointer_2也是指针变量,调用函数时,进行的是“值传递”。这个时候p1和pointer_1都指向a,p2和pointer_2都指向b,swap函数中,*p1和*p2的值互换,也就使a和b的值互换了。

    ***注意:C语言中实参变量和形参变量之间的数据传递是单向的“值传递”的方式。不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指变量的值。

    例3:输入3个整数a,b,c,要求按从大到小的顺序将它们输出,并用函数实现。

     1 #include <stdio.h>
     2 int main()
     3 {
     4     void exchange(int *q1,int *q2,int *q3);
     5     int a,b,c,*p1,*p2,*p3;
     6     printf("please enter three numbers:");
     7     scanf("%d,%d,%d",&a,&b,&c);
     8     p1=&a;
     9     p2=&b;
    10     p3=&c;
    11     exchange(p1,p2,p3);
    12     printf("The order is:%d,%d,%d
    ",a,b,c);
    13     return 0;
    14 } 
    15 void exchange(int *q1,int *q2,int *q3)
    16 {
    17     void swap(int *pt1,int *pt2);
    18     if(*q1<*q2) swap(q1,q2);
    19     if(*q1<*q3) swap(q1,q3);
    20     if(*q2<*q3) swap(q2,q3);
    21 }
    22 void swap(int *pt1,int *pt2)
    23 {
    24     int temp;
    25     temp=*pt1;
    26     *pt1=*pt2;
    27     *pt2=temp;
    28 }

    函数的嵌套调用思维需要好好的积累和练习。

    上述是指针的基本概念和简单应用,指针有很多灵活的使用,其中就包括指针和数组结合,指针和字符串结合的广泛使用。

  • 相关阅读:
    Linux 下 的 Oracle,如何安装 tnsname
    checkpoint process vs writer process vs wal writer process
    PostgreSQL的checkpoint能否并行
    PostgreSQL参数学习:wal_keep_segments
    PostgreSQL参数学习:vacuum_defer_clean_age
    PostgreSQL参数学习:max_wal_senders
    对PostgreSQL数据库的hstore类型建立GisT索引的实验
    PostgreSQL的hstore初步学习
    乐鑫esp8266基于freeRtos实现私有服务器本地远程OTA升级
    Android 6.0 超级简单的权限申请2 (Permission)
  • 原文地址:https://www.cnblogs.com/wxywxy/p/6880083.html
Copyright © 2020-2023  润新知