2.2.3指针

指针是C语言中非常重要的概念,也是C语言的特色之一。

定义指针变量的一般形式为:

    类型名  *指针变量名

例如,下列语句定义了指向float类型的指针变量p。

    float  *p;

指针用于存放变量的地址。

指针被定义后,必须将指针和一个特定的变量进行关联后,才可以使用指针,也就是说,指针变量要先赋值才能使用,当然指针变量被赋的值应该是地址。

 

指针的基本运算

指针可以同整数进行加减操作,例如,如果变量p是指向float类型变量的指针,那么表达式p+i代表了从p这个位置开始的第i个float类型变量的地址。

 

#include<stdio.h>
void Print(int *a)
{
    for(int i=0;i<10;i++)
        printf("%d ",a[i]);
    printf("\n");
}
int main()
{
    int a[10]={1,2,3,4,5,6,7,8,9,0};
    Print(a);
    int *c=a;//a是数组a的地址 
    printf("%d\n",*c);
    printf("%d\n",*c+1);//+1
    printf("%d\n",*c+2);//+2 
    return 0;
 } 

 

 

 

指针与数组

1.在C语言中,数组名本身就是数组的基地址,即第1个元素(下标为0)的地址。

2.在函数定义中,被声明为数组的形参实际上是一个指针。当传递数组时,按值调用传递它的基地址,数组元素 本身不被复制。

3.数组名作为函数的实参,在被调用函数中,就能访问实参数组所在的存储单元,不但可以引用,还能改变这些单元的内容。返回主调函数后,相应数组元素的值就改变了。

 

#include<stdio.h>
void Print(int *a)
{
    for(int i=0;i<10;i++)
        printf("%d ",a[i]);
}
int main()
{
    int a[10]={1,2,3,4,5,6,7,8,9,0};
    Print(a);
    return 0;
 } 

 

用指针实现内存动态分配

 在动态存储方面C语言提供了一组标准函数,定义在<stdlib.h>里面,主要有:

1.动态存储分配函数void *malloc(size):在内存的动态存储区分配一连续空间其长度为size。

若申请成功,则返回一个指向所分配内存空间的起始地址;若申请内存空间不成功,则返回NULL(值为0)。

该函数的返回值为(void *)类型,在具体使用中,需要将malloc的返回值转换到特定指针类型,并赋给一个指针变量。

2.动态存储释放函数void free(void *ptr):释放由动态分配函数申请到的整块内存空间,ptr为指向要释放空间的首地址。

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int *p=(int *)malloc(sizeof(int));
    printf("%d\n",p);//地址 
    scanf("%d",p);//向p指向的内存中写入数据 
    printf("%d",*p);//使用间接访问运算符*访问p中的数据 
    free(p);//释放 
    return 0;
 } 

 

posted @ 2018-05-30 20:18  润青  阅读(218)  评论(0编辑  收藏  举报