C语言学习笔记(九) -指针上 Pointer

来源:互联网 发布:金融证券软件 编辑:程序博客网 时间:2024/05/21 06:23

指针变量

/*指针变量:用来保存地址的变量        地址的获取 &指针定义: 类型  指针名  值 *星号的作用:取指针变量所指内存变量的值(*pa 取pa所指的值)  */#include <stdio.h>int main(void){    int a=1234;    int *pa=&a;   //定义一个指向整型的指针变量,&a获取整型变量a的值    int *pb=(int*)0x12345678;    int i=0x12345678;   //检测当前系统是小端还是大端    char *pc=(char*)&i;    //访问指针指向的内存的值(*p)    printf("%x\n",*pc);    return 0;}
/*   使用指针实现数据交换 */#include <stdio.h>void swap(int*,int*);int main(void){    int a,b;    printf("请输入两个数:\n");    scanf("%d %d",&a,&b);    int *pa=&a;    int *pb=&b;    swap(pa,pb);    printf("交换后的结果为:%d %d\n",a,b);    return 0;}void swap(int *pa,int *pb){    int temp;    temp=*pa;    *pa=*pb;    *pb=temp;}

指针的指针

/* 定义完指针变量后,可以给pa赋一个地址,但不能直接使用*pa; 当pa保存了一个有效的且合法的地址时,才可以使用*pa; */#include <stdio.h>int main (void){    int *pa=NULL;//指针在没有赋予初值时,一般用NULL初始化    // *pa=12;  //不能访问内存单元,可以访问地址单元    int a=4;    *&a; //首先对a取地址,然后访问改地址中存储的值    //&*a;  //错误,不能对a取值    pa=&a;    //*pa=a;  pa=&a;    *&pa;//首先对pa取地址,然后访问改地址中存储的值,整个表达式的结果时a的地址    &*pa;//首先取pa所指的单元a,之后取a的地址,表达式结果时a的地址    //指针的指针,指向指针变量的指针变量    int **ppa=&pa;    //**ppa=*pa=a;    printf("&ppa=%p\n",&ppa);    printf("ppa=%p &pa=%p\n",ppa,&pa);     //ppa=&pa    printf("*ppa=%p pa=%p &a=%p\n",*ppa,pa,&a);  //*ppa=pa=&a;    printf("**ppa=%d *pa=%d a=%d\n",**ppa,*pa,a);       //**ppa=*pa=a;    return 0;}

使用指针的指针实现数据交换

/* 使用指针的指针实现数据交换 **ppa=*pa=a *ppa=pa=&a *(*ppa)=*pa=a */#include <stdio.h>void swap();int main(void){    swap();    return 0;}void swap(){    int a=3,b=4;    int *pa=&a,*pb=&b;    int **ppa=&pa,**ppb=&pb;    int *temp=NULL;    temp=*ppa;    *ppa=*ppb;    *ppb=temp;    printf("a=%d b=%d\n",a,b);    printf("*pa=%d *pb=%d\n",*pa,*pb);    }

指针和一维数组

/*  指针和一维数组  1.数组名表示地址常量,不能直接给数组名赋值  2.仅有 sizeof(arr)和 &arr两种方式在使用数组名时,表示数组整体;除此之外均表示地址常量  3.指针的算术运算和关系运算        算术运算:指针+ -整型             表示地址偏移                指针++   指针--         表示指针变量进行偏移                指针-指针               表示两个地址间能存放多少基本数据类型        关系运算:指针> == >= < <= !=    表示比较两个地址值的大小 */#include <stdio.h>int main(void){    int arr[]={1,2,3,4,5,6,7,8,9};    //arr={1,2,3,4,,5,6,7,8,9};//❌    int *p=&arr[0];  //取数组第0个元素的地址,定义整型指针变量保存该地址    p=arr;      printf("%d\n",*p);    for (int i=0; i<9; i++) {        printf("%d ",*(p+i));//  *(p+i) = *(arr+i)    }    printf("\n");    p=arr+8;    //arr=arr+8;//❌ 数组名是地址常量不能被赋值    for (int j=0; j<9; j++) {        printf("%d ",*(p-j));    }    printf("\n");    //*(3+arr) =arr[3]    printf("%d[arr]= %d\n",3,3[arr]);    printf("p[i]=%d\n",p[0]); //9 *(p+i)    printf("p[i]=%d\n",p[-1]);//8    //指针与字符数组    char str[20]="abcdefg";    char *p1= &str[0];    printf("%d\n",*p1);    for (int i=0; p1[i]!='\0'; i++) {        printf("%d ",p1[i]); //   p1[i] = *(p1+i)    }    printf("\n");    return 0;}

指针++ 指针–

/*   指针++   指针--    *(p++)与(*p)++   *(p++)   指针++   (*p)++或者*p++   值++   指针-指针                  表示两个地址间能存放多少基本数据类型 */#include <stdio.h>int main(void){    int arr[]={1,2,3,4,5};    int *p=arr;    printf("%d\n",*p);    p++;    //p=p+1;    printf("%d\n",*p);    p=arr;    int *end=arr+sizeof(arr)/sizeof(arr[0]); //最后一个元素的下一个地址    while(p<end) {        printf("%d ",*(p++));    }    printf("\n");    char str[]="abcdefg";    char *p1=str;    while (*p1!='\0') {        printf("%c ",*p1++);    }    printf("\n");    int arr1[]={1,2,3,4,5};    int *p2=arr1;    int *p3=arr1+5;     printf("%ld \n",p3-p2);    return 0;}

使用指针查找数列中最大值和最小值

/* 使用指针查找数列中最大值和最小值 */#include <stdio.h>void max_min(int [],int,int *max,int *min);int main(void){    int i,a[10];    int max,min;    printf("随机输入10个数字:\n");    for (i=0; i<10; i++) {        scanf("%d ",&a[i]);    }    max_min(a,10,&max,&min);    printf("此数组最大值是:%d\n",max);    printf("此数组最小值是:%d\n",min);    return 0;}void max_min(int a[],int n,int *max,int *min){    int *p;    *max = *min= *a;    for (p=a+1; p<a+n; p++) {        if (*p>*max) {            *max=*p;        }else if(*p<*min){            *min=*p;        }    }    return 0;}

输入10个整数,存储在数组中,将最小值跟数组的第0个元素交换,将最大值跟数组最后一个元素交换

/* 输入10个整数,存储在数组中,将最小值跟数组的第0个元素交换,将最大值跟数组最后一个元素交换 */#include <stdio.h>void out(int a[],int len);int main(void){    int a[]={81,35,7,58,25,73,9};    int len=sizeof(a)/sizeof(a[0]);    int *pi=a;//pi=&a    int *pmin=a;    int *pmax=a;    for (; pi<a+len; pi++) {        if (*pmin>*pi) {            pmin=pi;        }        if (*pmax<*pi) {            pmax=pi;        }    }    int temp;    temp=*pmin;    *pmin=*a;    *a=temp;    //排除最大值被最小值交换的情况    if (pmax==a) {        pmax=pmin;    }    temp=*pmax;    *pmax=*(a+len-1);    *(a+len-1)=temp;    out(a,len);    return 0;}void out(int a[],int len){    for (int i=0; i<len; i++) {        printf("%d ",a[i]);    }    printf("\n");}

数组指针

/* 数组指针 数组指针:指向数组的指针变量,保存的地址表示数组整体 数组名:       做左值        做右值       类型         值类型 p   int(*)[4]     int[4] *p  int[4]        int */#include <stdio.h>int main(void){    int a[4]={1,2,3,4};//a作为数组名表示数组首元素地址 a==&a[0];    int(*p)[4]=&a; //仅有 sizeof(arr)和 &arr两种方式在使用数组名时,表示数组整体;除此之外均表示地址常量    printf("p==%p\n &a==%p\n",p,&a);    //使用数组指针,访问a[3]    //*p==*&a==a --> a[3]==(*p)[3]=*((*p)+3)    printf("a[3]==%d\n",(*p)[3]);//(*p)[3]=*((*p)+3)    printf("a[3]==%d\n",*((*p)+3));    //二维数组指针    int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};    int(*p1)[4]=&arr[0];  //arr p1指向数组arr的第0for (int i=0; i<3; i++) {        for (int j=0; j<4; j++) {            //arr[i][j]=*(*(arr+i)+j)=*(*(p1+i)+j)            printf("%d ",(*p1)[j]);//(*p1)取p1的值,取出后类型为int[4]        }                          //[j]从int[4]的首地址开始向后偏移j个,取出当前地址的值        printf("\n");        p1++;  //p1=p1+1  行指针向下移动到下一行    }    return 0;}

指针做函数参数

//// 指针做函数参数// 1.指针指向基本数据类型// 2.被调需要传递给主调超过一个值时,将多个值在主调中定义//  将定义的变量地址传递给被调,被调就可以间接访问主调中的多个变量// 3.在被调函数中不能修改参数的值,形参需定义为常量,表示指针变量始终指向主调中的那个变量//4.const修饰的是右边的内容  //(int * const pa)  pa不可变  //(int const *pa)   *pa不可变  //(int const * const pa)  *和pa均不可变 //#include <stdio.h>//不能使用全局变量,且返回值用来表示是否成功输入整型值int input(int *);int main(void){    int a;    if(input(&a)>0){       printf("%d\n",a);         }    return 0;}int input(int * const pa){    //pa=&n; //❌ const修饰的    *pa=10;    return 1;}
0 0
原创粉丝点击