(3)--3、指针与一维数组程序设计基础.ppt
C语言的精髓语言的精髓指针指针v指针与一维数组2023/11/1822学习目标学习目标v掌握指针与一维数组的关系v掌握通过指针操纵一维数组2023/11/183指针与一维数组指针与一维数组v指针和数组的关系极为密切数组名就是一个地址值它表示数组的首地址一个数组存储在一块连续内存单元中;数一个数组存储在一块连续内存单元中;数组名就是这块连续内存单元的组名就是这块连续内存单元的首地址首地址!2023/11/184指针与一维数组指针与一维数组2023/11/185指针与一维数组指针与一维数组int a5=1,2,3,4,5;数组名a代表了数组的首地址即:a与&a0相等!代码演示2023/11/186指针与一维数组指针与一维数组int a5,*pa;pa=a;/pa指向数组首地址指向数组首地址 a0a1a2a3a412345pa0019FF3C0019FF400019FF440019FF480019FF4C0019FF3C2023/11/187 指向一维数组的指针指向一维数组的指针v一个指针变量还可以指向一个数组元素 int*ptr,a5=1,2,3,4,5;ptr=a+3;/或者ptr=&a32023/11/188用用指针操作一维数组指针操作一维数组v指针操作一维数组方式一:int a5=1,2,3,4,5;int*ptr=a;for(int i=0;i5;i+)printf(“%dn”,ptr i );把指针当做数组名使用2023/11/189用用指针操作一维数组指针操作一维数组v指针操作一维数组方式二:int a5=1,2,3,4,5;int*ptr=a;for(int i=0;i5;i+)printf(“%dn”,*(ptr+i);指针偏移 sizeof(int)*i 个字节2023/11/1810用用指针操作一维数组指针操作一维数组v指针操作一维数组方式三:int a5=1,2,3,4,5;int*ptr=a;for(int i=0;i5;i+)printf(“%dn”,*(ptr+);指针通过+或者-向上或向下偏移 sizeof(int)个字节代码演示2023/11/1811指针与一维数组指针与一维数组int a5=1,2,3,4,5;int*ptr=a;for(int i=0;i5;i+)printf(“%dn”,*(ptr+);a0a1a2a3a4123450019FF3C0019FF400019FF440019FF480019FF4C未知地址未知地址未知地址未知地址解决方法:ptr=a;for(int i=0;i5;i+)printf(“%dn”,*(ptr+);2023/11/1812用用指针操作一维数组指针操作一维数组v如果改成下面这样可以吗?for(int i=0;i5;i+)printf(“%dn”,*(a+);错误:a是一个常量,值无法改变 所以不能用于自增和自减运算!2023/11/1813指针与一维数组指针与一维数组指针与数组名的区别类型是否可变可运算数组名不可变,它是常量无法+或-指针可以变,它是变量可以+或-2023/11/1814指针指针型数组型数组 int a5=1,2,3,4,5;char s20=“china”;那么有没有整型指针数组?int*b2=0X0019FF3C,0X0019FF40;2023/11/1815指针指针型数组型数组定义格式:指针类型 数组名N;int *a5;/整型指针数组char*s5;/字符型指针数组float*b5;/浮点型指针数组2023/11/1816指针指针型数组型数组指针型 数组,每个元素都是指针值!int a=10;int b3=1,2,3;int*c3=&a,b,&b1;2023/11/1817指向一维数组的指针示例指向一维数组的指针示例1#include void main()int data=5,10,15,20,25;int i=0;int*ptr;ptr=data;while(i 5)printf(“n 第%d 个元素的存储地址为:%p,值为:%dn“,i+1,ptr,*ptr);i+;ptr+;内存内存data0data1data2data3data451015202512ff6c12ff7012ff7412ff7812ff7c第第1个元素的存储地址为:个元素的存储地址为:12ff6c,值为:值为:5第第2个元素的存储地址为:个元素的存储地址为:12ff70,值为:值为:10第第3个元素的存储地址为:个元素的存储地址为:12ff74,值为:值为:15第第4个元素的存储地址为:个元素的存储地址为:12ff78,值为:值为:20第第5个元素的存储地址为:个元素的存储地址为:12ff7c,值为:值为:25ptrptrptrptrptr2023/11/1818指向一维数组的指针指向一维数组的指针示例示例2/一维数组逆序#include int main()int data5=12,26,34,58,90;int i,temp;int*start=data;int*end=data+4;while(startend)temp=*start;*start=*end;*end=temp;start+;end-;printf(数组逆序以后为:nn);for(i=0;i5;i+)printf(%dt,datai);printf(n);return 0;1226345890startstartstartendendend2023/11/1819小小结结v数组名就是这块连续内存单元的首地址int data50;/data是数组名,也是数组的首地址data 的值 与&data0 的值是相同的v数组data的第(i+1)个元素可表示为:第i+1个元素地址:&datai 或(data+i)第i+1个元素的值:datai 或*(data+i)2023/11/1820小小结结v为指向一维数组的指针赋值int*ptr=data;或者int*ptr=&data0;v指针变量可以指向一维数组元素int*ptr=&data4;或者 int*ptr=data+4;2023/11/1821谢谢大家!谢谢大家!谢谢大家!谢谢大家!