zoukankan      html  css  js  c++  java
  • C语言指针{学习笔记}

    按变量地址存取变量值的方式称为直接访问方式;

    定义特殊变量用来存放地址,i_pointer的值就是变量i所占用单元的起始地址;存取变量i的值。则要找到存放i的地址的变量,取出地址,然后到地址去取值;

    i_pointer=&i;

    一个变量的地址称为该变量的指针;

    如果有一个变量专门用来存放另一变量的地址(指针),称为指针变量; 

    区别:指针是一个地址,而指针变量是存放地址的变量;

    定义指针变量: 如: int *pointer_1;  //int是定义指针变量时必须制定的基类型,指针变量的基类型用来指定该指针变量可以指向的变量的类型;

    定义指针变量的一般形式为:  基类型  *指针变量名; 

    函数的参数也可以是指针类型,将一个变量的地址传送到另一个函数中;

    以变量名和数组名作为函数参数的比较:

    1.如果形参的类型为变量名,传递的是变量的值,不能通过函数调用改变实参的值

    2.如果形参的类型为数组名或指针变量,传递的是实参数组首元素的地址,能通过函数调用改变实参的值;

    指针变量做实参,必须先使指针变量有确定值,指向一个已定义的单元;

    用数组名作参数时,如果形参数组中各元素的值发生变化,实参数组元素的值随之变化;

    如果实参是数组名(即代表该数组首元素的地址),形参则需要定义指针变量(只有指针变量才能存放地址),常用这种方法通过调用一个函数来改变实参数组的值;

    实参数组名代表一个固定的地址,或者说是指针常量,但形参数组并不是固定的地址值,而是作为指针变量,在函数调用开始时,它的值等于实参数组首元素的地址,在函数执行期间,它可以再被赋值;

    归纳:

    如果有一个实参数组,要想再函数中改变此数组中的元素的值,实参与形参对应的关系有以下4种情况:

    a、形参和实参都用数组名

    //数组名做形参和实参;

    #include<studio.h>

    void main()

    {

    void inv(int x[],int n);

    int i,a[10]={3,7,9,11,0,6,7,5,4,2};

    printf("the original array: ");

    for (int i = 0; i < 10;i++)

    {

    /* code */printf("%d ",a[i] );

    printf(" ");

    }

    inv(a,10);

    printf("the array has been inverted: ");

    for (int i = 0; i <10; ++i)

    {

    /* code */printf("%d ",a[i]);

    printf(" ");

    }

    }

    void inv(int x[],int n)

    {

    int temp,i,j,m=(n-1)/2;

    for (int i = 0; i <= m; i++)

    {

    /* code */j=n-1-i;

    temp=x[i];

    x[i]=x[j];

    x[j]=temp;

    }

    return;

    }

    b、实参用数组名,形参用指针变量

    //指针变量做形参,数组名作实参;

    #include <studio.h>

    void main()

    {

    void inv(int *x,int n);

    int i,a[10]={3,7,9,11,0,6,7,5,4,2};

    printf("the original arrag: ");

    for (int i = 0; i < 10; i++)

    {

    /* code */printf("%d ",a[i] );

    printf(" ");

    }

    inv(a,10);

    printf("the array has been inverted: ");

    for (int i = 0; i < 10; i++)

    {

    /* code */printf("%d ",a[i]);

    printf(" ");

    }

    }

    void inv(int *x,int n)

    {

    int *p,temp,*i,*j,m=(n-1)/2;

    i=x;j=x+n-1;p=x+m;

    for (; i <=p; i++,j--)

    {

    /* code */temp=*i;

    *i=*j;

    *j=temp;

    }

    return ;

    }

    c、实参形参都用指针变量

    //指针变量做实参和形参

    #include<studio.h>

    void main()

    {

    void inv(int *x,int n);

    int i,arr[10];

    int *p=arr;

    printf("the original array: ");

    for (int i = 0; i < 10;p++)

    {

    scanf("%d",p);

    printf(" ");

    }

    p=arr;

    inv(p,10);

    printf("the array has been inverted: ");

    for (int p=arr; p<arr+10; p++)

    {

    printf("%d ",*p);

    printf(" ");

    }

    }

    void inv(int *x,int n)

    {

    int *p,temp,*i,*j,m=(n-1)/2;

    i=x;j=x+n-1;p=x+m;

    for (; i <= p; i++;j--)

    {

    /* code */j=n-1-i;

    temp=*i;

    *i=*j;

    *j=temp;

    }

    return;

    }

    d、实参为指针变量,形参为数组名

  • 相关阅读:
    Educational Codeforces Round 51 (Rated for Div. 2)
    Kruskal重构树入门
    编译原理词法分析
    java.lang.String内部结构的变化
    android 世界各国英文简写代码 资源文件
    openCV python 安装
    解读30个提高Web程序执行效率的好经验
    从认知盈余说起,也谈分享精神
    STL set multiset map multimap unordered_set unordered_map example
    [置顶] 【Git入门之一】Git是神马?
  • 原文地址:https://www.cnblogs.com/collect/p/4123347.html
Copyright © 2011-2022 走看看