C语言 基础指针简介

一、指针

所谓指针,就是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。这里介绍一小部分;

首先,介绍声名指针变量:

int p;       //一个整形数p;
int *p;      //一个指针p;
int p[50];   //一个数组p,其中的所有数据均为int;
int *p[50];  //一个数组p,其中的数据类型均是指针;

 这里要注意:int p;是定义了一个整型数p;所以int *p;首先是定义了一个整型数*p;并且你所定义的指针即为p(这里指向p的地址);

二、运算符&和*

这里&是取地址运算符,*是间接运算符。
&a 的运算结果是一个指针,指针的类型是a 的类型加个*,指针所指向的类型是a 的类型,指针所指向的地址嘛,那就是a 的地址。
*p 的运算结果就五花八门了。总之*p 的结果是p 所指向的东西,这个东西有这些特点:它的类型是p 指向的类型,它所占用的地址是p所指向的地址。

例如以下程序:

#include<stdio.h>
int main()
{
    int a,b;
    int *p;
    while(scanf("%d%d",&a,&b)!=EOF)
    {
        p=&a;
        b=*p+5;
        printf("%d",b);
    }
}

首先,输入整型数a,然后,再将a的值赋给指针p,特别注意这里一定要都是指向地址的变量才对;最后,再将b由*p+5运算得出,运行的结果就是把a的值加上5;

一个简单的换数:

#include<stdio.h>
void swap(int *p1,int *p2)
{
    int temp;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}
int main()
{
    int a,b;
    int *pointer1,*pointer2;
    while(scanf("%d%d",&a,&b)!=EOF)
    {
        pointer1=&a;
        pointer2=&b;
        if(a<b)
        {
            swap(pointer1,pointer2);
        }
        printf("%d %d\n",a,b);
    }
}

三、指针与数组

先看下面一个程序;

#include<stdio.h>
void main(){
    int a[20];
    int *p,*q;
    p=&a[3];
    q=&a[18];
    printf("q-p=%d\n",q-p);
}

算出来运行结果了吗?没错就是q-p=15,这里的p和q分别指向的是a[3]和[18]的地址,即为p=3,q=18;在这里a[3]和a[18]都是数组啊中的一个整型数据,在对其取地址&a[3],&a[18],意为在给指针p、q赋值运算,延伸一下如果再对p做运算p+1,则为将p移向下一个地址,即为&a[4],而*p也就是a[4];

下面来看给一个数组逆序:

#include<stdio.h>
void invert(int *p,int n){
    int i;
    int temp;
    for(i=0;i<=(n-1)/2;i++){
        temp=*(p+i);       //p+i为第i个数,
        *(p+i)=*(p+n-i-1); //p+n-i-1为第n-i-1个数,与p+i位置对称;
        *(p+n-i-1)=temp;   //把正数第i个数与倒数第i个数交换;
    }
}
void main()
{
    int a[10]={1,3,5,7,9,1,3,5,7,9};
    int i,*p;
    void invert();
    p=a;     //把数组a赋给指针p,数组不用取地址&;
    for(i=0;i<10;i++)
    {
        printf("%-5d",a[i]);
    }
    printf("\n");
    invert(p,10);     //代入函数invert,代入指针p,不要加*,就像把数组代入函数中一样;
    for(i=0;i<10;i++)
    {
        printf("%-5d",a[i]);
    }
}

 运行结果如下:可以看到还是很耗时间的。

四、更多

参见更多指针的详细用法及问题说明请见: C语言指针详解(经典,非常详细)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章