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的第0行 for (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
- C语言学习笔记(九) -指针上 Pointer
- C语言学习笔记(十) -指针下 Pointer
- c语言学习笔记九
- C语言学习笔记<九>
- C学习笔记(九)指针
- c语言指针学习笔记
- C语言指针学习笔记
- C语言指针学习笔记
- C语言指针学习笔记
- c语言学习笔记--指针
- C语言学习笔记-指针
- C语言指针学习笔记
- C语言学习:指针(笔记)
- C语言学习笔记-指针
- C语言指针学习笔记
- C语言第八讲(Pointer指针)
- 011-指针(上)-C语言笔记
- C语言学习笔记(九)--函数
- hue 的安装
- SDK Manager 闪退的解决方案
- (C#) 内置 委托(1)
- 虚拟机相关设置
- SQL基础语句
- C语言学习笔记(九) -指针上 Pointer
- hnoi2014米特运输
- css float
- 关于GCD(详细)
- String to Integer (atoi)
- 虚拟光驱 DAEMON Tools Lite 安装笔记
- 触摸屏设备驱动程序
- 工频干扰现象
- 9-patch图片以及例子说明