您好,欢迎访问三七文档
指针及结构体指针1.基本概念2.指针使用3.数组与指针4.函数指针5.指针型函数返回值6.指针数组7.结构体指针及其使用8.链表基本概念内存地址–系统内存区域中存储单元的组织序号–以字节(byte)为最小单位–地址连续变量–变量名是系统中对象的命名–系统对象保存在内存单元组–变量值是存储单元组的内容–*变量名是内存单元组起始地址的命名charchintishortmint*pa..0x3df800040x3df800080x3df8000a0x3df8000c...0x3df800ac........1024205'A'0x3df800ac865基本概念(续一)指针–是一个常量值–是内存中某个地址–!!通过指针可以访问它所指向的内存区域–变量地址:变量所占存储单元的起始地址=指针–指针变量:内容或变量值是指针的变量类型限定符=扩展类型存取方式---访问(R/W)变量或对象–直接:根据变量名直接访问内容–间接:通过指针访问它所指向的对象指针使用(续一)引用指针–主要运算符&:取址运算符–获取变量的地址*:取值运算符(或间接访问/递引用运算符)–访问指针所指向的对象或变量例2、通过指针访问整型变量intmain(){inta;int*pa;pa=&a;//papointstoaprintf(%d,%d,a,*pa);//???,???a=20;printf(%d,%d,a,*pa);//20,20scanf(%d,&a);//15printf(%d,%d,a,*pa);//15,15return0;}0x8d30400420paa0x8d304004150x8d304004???指针使用(续二)–特点&、*同级但高于算术运算符自右向左结合特殊形式的运算–例3inta,*pa=&a;&*pa;//==???*&a;//==???允许++/--、+/-–按基类型增大或减少,变化为一个或多个基本类型所需空间的大小–例4(*pa)++vs.*pa++pa+=2;pa=pa-1;0x8d304004???paa0x8d304008???paa'指针使用(续三)–例5,假定每个整数占用4个字节inta;charch;int*pa=&a;//假定&a==0xc48d4024char*ps=&ch;//假定&ch==0xc48d4012pa++;//pa==0xc48d4028[+sizeof(int)]ps++;//ps==0xc48d4013[+sizeof(char)]数组与指针二者关系数组的指针---数组名作为指针–是数组的起始地址–数组是内存连续区域,有起始/终止地址–数组元素占用相同空间–数组起始地址等于数组第一个元素地址数组元素指针变量---访问数组–指向数组元素的同型指针变量–数组元素有地址且连续–可以遍历数组数组与指针(续一)基本用法以整型数组inta[5]={1,20,3,19,2}为例–指针指向某个元素int*pa=&a[0];//第1个元素pa=&a[0];//或pa=a–通过指针访问数组元素inti;读:i=*pa;写:*pa=7;//=a[0]=7访问pa指向元素后面的第i个元素---(pa+i)*(pa+2)=5;//=a[2]=5pa+=i;//pa指向它后面第i个元素指向它前一个/后一个元素pa++/pa--用数组名访问元素*(a+4)=4;//=a[4]=41--7203--5192--4a[0]a[4]pa&a[0]函数指针函数是一个可执行例程的入口点地址–函数名是一个地址常量–可以作为函数参数函数指针:指向函数的指针–指针变量的值是函数入口地址–访问函数指针指向的对象=函数调用用法–定义语法RetDataType(*pfn)([ParaList])pfn必须包含在括号内函数指针(续一)–使用pfn作为指针变量存在例1、使用函数指针求最大值p261intmain(){intmax(inta,intb);int(*pmax)(int,int);intx,y,z;pmax=max;printf(inputtwonumbers:\n);scanf(%d%d,&x,&y);//1033z=(*pmax)(x,y);printf(maxmum=%d\n,z);//maxmum=33return0;}intmax(intx,inty){return(xy?x:y);}....pmax...max函数指针(续二)*函数指针是扩展类型,可作为返回值函数指针作为参数例2、获得数组中最大值元素intmax2(inta,intb);intmaxX(int(*pf)(int,int),intA[],intn){inti,max;max=A[0];for(i=0;in;i++)max=pf(max,A[i]);returnmax;}intmain(){intA[]={1,20,-10,23,5,299,-9};printf(maxofA[]is%d\n,maxX(max2,A,sizeof(A)/sizeof(A[0])));return0;}指针型函数返回值函数返回值可以是指针–指向某个对象–数组的起始地址例1、获得数组中最大值元素的地址int*maxX(intA[],intn){inti,k;k=0;for(i=1;in;i++)if(A[k]A[i])k=i;return(&A[k]);}指针数组定义–数组元素类型是指针–用于函数传递、循环等例1、输出多个字符串#includestdio.hintmain(){char*pNames[5]={Zhang,Wang,Li,Zhao,NULL};char**pStr=pNames;while(*pStr)puts(*pStr++);return0;}结构体指针及其使用*结构体指针变量–基类型是结构体类型的指针变量structtagStudent*pStud1=&S1;structtagStudent*pStud2=S;–基本操作++/--,+/-访问结构体成员–取值/递引用[*](*pStud1).SNo=20021535;//S1.SNo=20021535–指向运算符[-]=[(*).]pStud1-SNo=20021534;10...SNopStud211...12...结构体指针及其使用(续一)例1、使用结构体指针显示S1信息S1.SNo=18;S1.chSex='m';strcpy(S1.szName,LiMing);S1.score=84.5;printf(S1={%4d,'%c',`%s',%5.1f}\n,pStud-SNo,pStud-chSex,pStud-szName,pStud-score);return0;}#includestdio.h#includestring.hintmain(void){structtagStudent{intSNo;charchSex;charszName[16];floatscore;};structtagStudentS1;structtagStudent*pStud=&S1;链表定义–相同类型的结构体对象形成一个逻辑链–只能沿一个方向处理–链表中的对象称为节点–节点可以动态插入/删除(insert/delete)动态内存管理–分配void*malloc(size_tsize);//Requestmemoryfromheap–释放voidfree(void*ptr);//ReleasetheallocatedmemorypNIL…
本文标题:指针&结构体指针
链接地址:https://www.777doc.com/doc-5017415 .html