C语言指针的理解与应用(案例丰富)

本文详细介绍了C语言中的指针和指针变量,包括如何定义指针变量,以及在指针中如何使用&和*运算符。通过实例展示了数组名、下标法、指针变量输出数组元素的三种方法,并讲解了指针在数组中的操作,如数组逆序输出和排序。此外,还探讨了多维数组和指针的关系,以及在字符和字符串操作中的应用。
摘要由CSDN通过智能技术生成

目录

指针与指针变量:

定义指针变量:

在指针中 & 和 * 运算符的运用:

        数组名输出数组中的全部元素的三种方法:下标法,数组名,指针变量(有干货)

第一种方法:下标法:

第二种方法:数组名

第三种方法:指针变量

理解指针在数组中的操作:

数组作为函数的形参:用指针的方式将数组逆序输出

用指针将数组中的元素从大到小排序:

指向多维数组的指针变量:

理解指针在二维数组中的操作:

指针在字符和字符中的使用: 

字符数组做参数:

指针做参数:



指针与指针变量:

指针:知道一个变量的地址,通过该地址可以访问到这个变量,这个变量的地址称为该变量的“指针”。

指针变量:C语言可以定义一类特殊的变量,这些变量专门用来存放变量的地址,称为指针变量。

定义指针变量:

在定义指针变量时必须指定基本类型。需要注意的:只有相同基本类型的变量地址才能放到指向相同基本类型的指针变量,例如下面赋值是不可行的:即只有整型变量的地址才能放到指向整型变量的指针变量中

float a;
int *p1;
p1=&a;

在指针中 & 和 * 运算符的运用:

&和*两个运算符优先级别相同,按自右向左方向结合。

问题:p1=&a,& *p1的含义是什么?

*p1是拿到存放在p1这个地址所指向变量的值,&这个运算符是用来获取变量的地址的,因此,

& *p1和&a相同,即变量a的地址。

    int a,b;
    int *point_1,*point_2;
    a=100;
    b=10;
    point_1=&a;
    point_2=&b;
    printf("%d,%d\n",a,b);   //结果为:100,10
    printf("%d,%d\n",*point_1,*point_2);   //结果为:100,10

数组名输出数组中的全部元素的三种方法:下标法,数组名,指针变量(有干货)

第一种方法:下标法:

//输出数组中的全部元素,第一种方法:下标法
int main()
{
   int a[10];
   int i;
   printf("pelase input 10 number:\n");
   //录入数组元素
   for(i=0;i<10;i++)
   {
       scanf("%d",&a[i]);
   }
   printf("\n");
   printf("output number:  \n");
   //输出数组
   for(i=0;i<10;i++)
   {
       printf("%d  ",a[i]);
   }
    return 0;
}

第二种方法:数组名

int main()
{
   int a[10];
   int i;
   printf("pelase input 10 number:\n");
   //录入数组元素
   for(i=0;i<10;i++)
   {
       scanf("%d",&a[i]);
   }
   printf("\n");
    printf("output number:  \n");
   //输出数组
   for(i=0;i<10;i++)
   {
       printf("%d  ", *(a+i));
   }
    return 0;
}

第三种方法:指针变量

注意:刚开始p指向数组第一个元素,循环之后p指向数组的第10个元素,所以输出数组前要把指针重新指向数组的第一个元素。若不改变循环后的指针,则结果会出人意料,自己可以尝试一下,避免以后踩坑。

//输出数组中的全部元素,第二种方法:指针变量
int main()
{
   int a[10];
   int i,*p;
   p=a;     //p指向数组第一个元素
   printf("pelase input 10 number:\n");
   //录入数组元素
   for(i=0;i<10;i++)
   {
       scanf("%d",p++);
   }
   //循环之后p指向数组的第10个元素,所以输出数组前要把指针重新指向数组的第一个元素
   printf("\n");
    printf("output number:  \n");
   //输出数组
   for(p=p-10,i=0;i<10;i++,p++)
   {
       printf("%d  ", *p);
   }
    return 0;
}

理解指针在数组中的操作:

int a[2][5]={56,5,9,8,10,34,24,63,88,99};

数组作为函数的形参:用指针的方式将数组逆序输出

#include <stdio.h>
#include <stdlib.h>
void reverse(int array[],int n);
void reverse1(int *array,int n);
int main()
{
    int i,a[10]={56,5,9,8,10,34,24,63,88,99};
    printf("the original array:\n");
    for(i=0;i<10;i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
    reverse1(a,10);
    // reverse(a,10);
    printf("the array has been inverted:\n");
    for(i=0;i<10;i++)
    {
        printf("%d ",a[i]);
    }

    return 0;
}

//用指针实现

void reverse1(int *array,int n)
{
    int *p,temp,*i,*j,m;
    m=(n-1)/2;
    i=array;     //指向数组第一个元素
    j=array+n-1;  //指向数组最后一个元素
    p=array+m;     //指向中间元素
    //10个元素循环5次
    for(;i<=p;i++,j--)
    {
        temp=*i;
        *i=*j;
        *j=temp;
    }
}

//将数组逆序输出
void reverse(int array[],int n)
{
    int temp,i,j,m;
    m=(n-1)/2;    //m=4

    for(i=0;i<=m;i++)
    {
        //i往右移动多少,j相应也会往左移动多少
        j=n-1-i;    //j对应数组最后一个元素的下标
        temp=array[i];
        array[i]=array[j];
        array[j]=temp;
    }

}

用指针将数组中的元素从大到小排序:

#include <stdio.h>
#include <stdlib.h>
void sort(int array[],int n);

int main()
{
    int *p,i,a[10]={56,5,9,8,10,34,24,63,88,99};
    printf("the original array:\n");
    for(i=0;i<10;i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
    p=a;
    sort(p,10);
    printf("the result is:\n");
    for(p=a,i=0;i<10;i++,p++)
    {
        printf("%d ",*p);
       // p++;
    }

    return 0;
}
void sort(int array[],int n)
{
    int i,j,k,t;
    for(i=0;i<n-1;i++)  //外层循环,10个数要9次大循环
    {
        k=i;
        for(j=i+1;j<n;j++)
        {
            if(array[j]>array[k])
            {
                //如果数组后一个数大于前一个数则交换
                t=array[j];
                array[j]=array[k];
                array[k]=t;
            }
        }
    }
}

指向多维数组的指针变量:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
    //查看数组元素的地址
    printf("a:%d\n",a);
    printf("a:%d\n",*a);
    printf("a[0]:%d\n",a[0]);
    printf("&a[0]:%d\n",&a[0]);
    printf("&a[0][0]:%d\n",&a[0][0]);
    printf("a+1:%d\n",a+1);
    printf("*(a+1):%d\n",*(a+1));
    printf("==========================\n");
    //用指针变量输出二维数组元素的值
    int (*p)[4];
    int i,j;
    p=a;
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
        {
            printf("%2d ",*(*(p+i)+j));
        }
        printf("\n");
    }
    return 0;
}

运行结果:

f21c96bdc2984540941c9777086f29d9.png

理解指针在二维数组中的操作:

表示形式含义地址(假设一个)
a指向一维数组a[0],即0行首地址2000
a[0],*(a+0),*a0行0列元素2000
a+1,&a[1]1行首地址2016
a[1],*(a+1)1行0列元素a[1][0]的地址2016
a[1]+2,*(a+1)+2,&a[1][2]一行二列元素a[1][2]的地址2024
*(a[1]+2),*(*(a+1)+2),a[1][2]一行二列元素a[1][2]的值元素值为6

指针在字符和字符中的使用: 

一:下标法:

    char a[]="I love C and linux !",b[36];
    int i;
    for(i=0;*(a+i) !='\0';i++)
    {
        *(b+i)=*(a+i);
    }
    *(b+i)='\0';
    printf("string a is :%s\n",a);
    printf("string b is  :");
    for(i=0;b[i] !='\0';i++)
    {
        printf("%c",b[i]);
    }
    printf("\n");

二:指针法:

    //指针法

    char a[]="I love C and linux !",b[36];
    int i,*p1,*p2;
    p1=a;
    p2=b;
    for(;*p1 !='\0';p1++,p2++)
    {
        *p2=*p1;

    }
    *p2='\0';
    printf("string a is :%s\n",a);
    printf("string b is :");
    for(i=0;b[i] !='\0';i++)
    {
        printf("%c",b[i]);
    }
    printf("\n");

字符数组做参数:

#include<stdio.h>
//字符数组做参数
void copy_string(char src[],char aim[]);

void main()
{
    char a[]="I love C and linux !";
    char b[]="but I do not like study!";
    printf("string a=%s\n   string b=%s\n",a,b);
    printf("copy string a to string b :\n");
    copy_string(a,b);
    printf("string a=%s   string b=%s\n",a,b);
}
copy_string(char src[],char aim[])
{
    int i;
    while(src[i] !='\0')
    {
        aim[i]=src[i];
    }
    aim[i]='\0';
}

指针做参数:

#include<stdio.h>
//指针做参数
void copy_string(char *src,char *aim);

void main()
{
    char *a="I love C and linux !";
    char b[]="but I do not like study!";
    printf("string a=%s   string b=%s\n",a,b);
    printf("copy string a to string b :\n");
    copy_string(a,b);
    printf("string a=%s\n   string b=%s\n",a,b);
}
copy_string(char *src,char *aim)
{
    int i;
   for(;*src !='\0';src++,aim++)
   {
       *aim=*src;
   }
    *aim='\0';
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值