1、2某班有某班有n n名学生,记录所有学生的成绩;名学生,记录所有学生的成绩; int n;int n; scanf(%d,&n); scanf(%d,&n); int sn; int sn; 可以用指针实现数组大小的动态调整。可以用指针实现数组大小的动态调整。 int int * *p;p; p = (int p = (int * *)malloc(n)malloc(n* *sizeof(int); sizeof(int); 解决问题:某班有解决问题:某班有100100名学生,记录下所有学名学生,记录下所有学生的成绩生的成绩; ; int s100; 指指 针针 5.1 指针的概念指针的概念
2、地址地址 指针指针 间接访问间接访问变量与地址程序中程序中: short i; float k; 内存中每个字节有一个编号内存中每个字节有一个编号-地址地址.2000200120022005内存内存02003ik 编译或函数调用时为其分配内存单元编译或函数调用时为其分配内存单元变量变量是对程序中数据是对程序中数据存储空间的抽象存储空间的抽象.2000200420062005短整型变量短整型变量i10变量变量i_pointer200120022003 指针与指针变量指针与指针变量 指针:一个变量的地址指针:一个变量的地址 指针变量:专门存放变量地址的变量指针变量:专门存放变量地址的变量2000指
3、针指针指针变量指针变量 变量的变量的内容内容 变量的变量的地址地址指针变量指针变量变量变量变量地址变量地址(指针指针)变量值变量值指向指向地址存入地址存入指针变量指针变量指针变量定义格式:指针变量定义格式: 数据类型数据类型 * 变量名变量名;int *p1;char *pc,c;* 指明说明的变指明说明的变量为指针变量量为指针变量表明指针变量所指向表明指针变量所指向的变量的数据类型的变量的数据类型定义了指向整型变量的指针变量定义了指向整型变量的指针变量p1定义了字符型变量定义了字符型变量c,及指向字,及指向字符型变量的指针变量符型变量的指针变量pci_pointer = &i = &(*i_
4、pointer)i = *i_pointer = *(&i)i_pointer = &i = &(*i_pointer)i = *i_pointer = *(&i) &与与*运算符运算符 含义:含义: &(取地址运算符取地址运算符) *(指针运算符指针运算符)含义含义: 取指针变量所指向变量的内容取指针变量所指向变量的内容单目运算符单目运算符优先级优先级: 2结合性结合性:自右向左自右向左 两者关系:互为两者关系:互为逆运算逆运算 理解理解.2000200420062005短整型变量短整型变量i10变量变量i_pointer2001200220032000指针变量指针变量i_pointer-指
5、针变量,它的内容是地址量指针变量,它的内容是地址量*i_pointer-指针的指针的目标变量目标变量,它的内容是数据,它的内容是数据&i_pointer-指针变量占用内存的地址指针变量占用内存的地址200010i_pointer*i_pointer&i_pointeri含义含义: 取变量的地址取变量的地址单目运算符单目运算符优先级优先级: 2结合性结合性:自右向左自右向左 直接访问与间接访问直接访问与间接访问 直接访问:直接访问:按变量地址存取变量值按变量地址存取变量值 间接访问:间接访问:通过存放变量地址的变量去访问变量通过存放变量地址的变量去访问变量例例 i=3; -直接访问直接访问.20
6、00200420062005短整型变量短整型变量i10变量变量i_pointer20012002200320003例例 *i_pointer=20; -间接访问间接访问20例例 k=i; -直接访问直接访问 k=*i_pointer; -间接访问间接访问例例 k=i; -直接访问直接访问 k=*i_pointer; .2000200420062005短整型变量短整型变量i10变量变量i_pointer2001200220032000短整型变量短整型变量k10.整型变量整型变量10指针变量指针变量仅仅是定义了可以指向仅仅是定义了可以指向型数据型数据的指针变量,但并未指向的指针变量,但并未指向a.
7、整型变量整型变量10指针变量指针变量定义指针变量定义指针变量pa,pb将将a的地址送的地址送pa将将b的地址送的地址送pb输出所指向的变量的内容输出所指向的变量的内容运行结果为运行结果为100,10100,10例例 :#include main()int i,*ip; ip=&i;i=10; printf( %d,%dn ,i,*ip); *ip=100; printf( %d,%dn ,i,*ip);运行结果:运行结果:10,10100,100将指针变量初始化为空指针,意为该变量不指向任一内将指针变量初始化为空指针,意为该变量不指向任一内存单元存单元将变量的地址赋值给指针将变量的地址赋值给指
8、针同类型的指针变量之间互相赋值同类型的指针变量之间互相赋值int *ptr=NULLint a;int *p=&a;int a,*pa=&a,*pb; pb=pa;把数组的把数组的首地址首地址赋予指向数组的指针变量赋予指向数组的指针变量int a5,*pa; pa=a; (或或pa=&a0;)如:如: p+np+n、p-np-n、p+p+、p-p-、+p+p、-p-p其中:其中:p p为指针变量,为指针变量,n n为整数为整数+ + p p向地址编号增大的方向移动向地址编号增大的方向移动- - p p向地址编号减小的方向移动向地址编号减小的方向移动注意:注意:在对指针进行加、减运算中,数字在对
9、指针进行加、减运算中,数字1 1不再代表不再代表 十进制中的整数十进制中的整数1 1,事实上,事实上 p+1p+1p +1*sizeof(基类型)基类型)p + n 的值 = ADDR + n * sizeof(ptype)p - n 的值 = ADDR - n * sizeof(ptype)pp+12的高位字节的高位字节2的低位字节的低位字节2的高位字节的高位字节2的低位字节的低位字节20002002200420062008a0a1a2a3a4short a5= 2,4, 23,6,78 ;short *p;p=a;pp+1要求:必须是指向要求:必须是指向同一数组同一数组的两个指针变量之间。
10、的两个指针变量之间。相减:求出两者之间的数据个数。(注:相减:求出两者之间的数据个数。(注:不可相加不可相加)关系运算:表示两者所指数组元素间的关系。关系运算:表示两者所指数组元素间的关系。 可进行的运算:可进行的运算:=、=、p2 p1地址在地址在p2后后 p1p2 p1地址在地址在p2前前错!错!对!对!int i,*p;p=&i;int *p;float *q;p=q;int i;float *p;p=&i;int *p;p=100;指针变量只指针变量只存放地址存放地址!一个指针变量不能一个指针变量不能指向与其类型不同指向与其类型不同的变量的变量!我是真的,我是真的,你猜对了吗?你猜对了吗?应在类型相应在类型相同的指针变同的指针变量之间赋值量之间赋值
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。