• C语言指针复习


    本文来自https://blog.csdn.net/ccchenxi/article/details/83271212

    第8章 指针
    8.1 指针变量
    1.指针变量定义及赋值:int a;  int *p=&a; 或 int a;  int *p;  p=&a;
    2.指针运算符:(1)取地址运算符& (2)取内容运算符* (结合性均为右至左)
    3.指针加1,不是纯加1,而是加一个所指变量的字节个数
    4.指针变量作为函数参数,例,交换函数swap():
    #include<stdio.h>
    void swap1(int *p1,int *p2) //交换地址中的值
    {
        int t; //p1,p2中存的是a和b的地址,将p1和p2地址中的内容交换,即p1中a地址中值变为b,p2中b地址中值变为a
        t=*p1;
        *p1=*p2;
        *p2=t;
    }
    void swap2(int *p1,int *p2) //交换形参指针指向的地址,无法返回给主函数p1,p2
    {
        int *t; //交换后p1指向b地址,p2指向a地址,仅形参指向改变,不影响实参
        t=p1;
        p1=p2;
        p2=t;
    }
    int main()
    {
        int a,b;
        int *p1,*p2;
        p1=&a;
        p2=&b;
        while(~scanf("%d%d",p1,p2))
        {
            printf("a=%d,b=%d ",a,b);
            printf("p1=%d,p2=%d ",p1,p2);
            swap1(p1,p2);
            printf("交换值结果: ");
            printf("a=%d,b=%d ",a,b);
            printf("p1=%d,p2=%d ",p1,p2);
            /*
            swap2(p1,p2);
            printf("交换地址测试结果: ");
            printf("a=%d,b=%d ",a,b);
            printf("p1=%d,p2=%d ",p1,p2);
            */
        }
        return 0;
    }


    8.2 指向数组的指针
    8.2.1指向一维数组的指针
    1.定义及赋值:int a[5],*p; p=&a[0]; 或p=a;
    2.引用数组元素
    (1)地址表示法:a[i]的地址:p+3、a+3、&a[i]
    (2)数组元素表示法:a[i]的访问:*(p+3)、*(a+3)、a[i]
    (3)指针变量加下标:指针变量可以加下标:p[i]
    (4)指针变量与数组名的引用区别:数组名表示数组首地址,属于常量,p为指向数值a的指针变量,p++可以,a++不可以
    (5)例,逆序输出10个数
    #include<stdio.h>
    int main()
    {
        int i,n,*p,a[10];
        p=a;
        while(~scanf("%d",&n))
        {
            for(i=0; i<n; i++)
            {
                scanf("%d",&a[i]);
            }
            for(i=n-1; i>=0; i--) //下标法访问数组
            {
                printf("%d ",a[i]);
            }
            printf(" ");
            for(i=n-1; i>=0; i--) //数组名访问数组
            {
                printf("%d ",*(a+i));
            }
            printf(" ");
            for(i=n-1; i>=0; i--) //指针变量访问变量(1)
            {
                printf("%d ",*(p+i));
            }
            printf(" ");
            for(p=a+n-1; p>=a; p--) //指针变量访问变量(2)
            {
                printf("%d ",*p);
            }
            printf(" ");
        }
        return 0;
    }
    12345678910111213141516171819202122232425262728293031323334
    8.2.2指向多维数组的指针
    int s[3][4];
    1.行转列:s+0、s+1、s+2是每一行的首地址,进行的是行操作,若想利用s对行中各元素操作,必须将行操作方式转为列操作方式。转换方式*(s+i)(i=0,1,2)
    2.二维数组的指针表示形式:
    (1)数组首地址:s
    (2)i行首地址:s+i = &s[i]
    (3)i行j列元素地址:s[i]+j = *(s+i)+j = &s[i][j]
    (4)i行j列元素:*(s[i]+j) = *(*(s+i)+j) = s[i][j]
    3.指向多维数组的指针:
    (1)指向数组元素的指针变量 int p=s[0];
    (2)指向由m个元素组成的一维数组的指针变量:int (*p)[4]; p=s;
    例:
    #include<stdio.h>
    int main()
    {
        int s[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
        //(1)用指向数组元素的指针变量输出数组元素
        int *p1;
        for(p1=s[0]; p1<s[0]+12; p1++)
        {
            if((p1-s[0])%4==0)
            {
                printf(" ");
            }
            printf("%d ",*p1);
        }
        printf(" ");
        //(2)用指向一维数组的指针变量输出任一行任一列的元素
        int i,j;
        int (*p2)[4];
        p2=s;
        scanf("%d%d",&i,&j);
        printf("%d ",*(*(p2+i)+j));
        return 0;
    }
    12345678910111213141516171819202122232425
    8.3 指向字符串的指针
    1.可以不定义字符数组,直接定义指向字符串的指针变量,利用指针变量操作字符串,如:
    char *str = “I’m a student”;  printf(“%s ”,str);
    8.4 指向函数的指针
    1.定义指向函数的指针变量格式:数据类型(*指针变量名)();
    2.赋值格式:指针变量名=函数名;
    3.调用格式:(*指针变量名)(实参表)
    例:
    //输入5个数,求最大值
    #include<stdio.h>
    int max(int *p)
    {
        int i;
        int m=p[0];
        for(i=1; i<5; i++)
        {
            if(*(p+i)>m) m=*(p+i);
        }
        return m;
    }
    int main()
    {
        int i,m,a[5];
        int (*f)(int *p); //定义指向函数的指针变量f
        for(i=0; i<5; i++)
        {
            scanf("%d",&a[i]);
        }
        f=max;  //将函数max入口地址赋值给f
        m=(*f)(a);  //利用指针变量f调用函数
        printf("%d ",m);
        return 0;
    }
    12345678910111213141516171819202122232425
    4.指向函数的指针做函数参数
    5.返回指针值的函数
    8.5 指向指针的指针(二级指针)
    ————————————————
    版权声明:本文为CSDN博主「ccchenxi」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/ccchenxi/article/details/83271212
  • 相关阅读:
    PWNABLE Silver Bullet
    PWNABLE hacknote
    PWNABLE calc
    vue如何监听浏览器的返回,并进行操作
    字符串的拼接和截取例子
    关于vue在url上向后台动态传递参数
    鼠标移动到超链接上时变为手型
    vue.js 单选框根据v-bind:disabled="条件" 来动态修改多个单选框是否只读
    关于node重装后启动项目报错
    关于在下名字问题的研究报告
  • 原文地址:https://www.cnblogs.com/pquan/p/12641862.html
Copyright © 2020-2023  润新知