指针的概念学习课件
48页1、 第第8章章 指针指针8.1 指针概念指针概念指针是指针是C的一个重要概念。其特点是:的一个重要概念。其特点是:能有效地表示复杂的数据结构;能有效地表示复杂的数据结构;能动态地分配内存,能动态地分配内存,直接处理内存地址;直接处理内存地址;能方便、有效地使用字符串和数能方便、有效地使用字符串和数组;组;能在调用函数后获得多个值。能在调用函数后获得多个值。C中定义的变量,在编译时按变量的类型来分配一中定义的变量,在编译时按变量的类型来分配一定长度的内存单元。在运行时,根据变量名与地址的对定长度的内存单元。在运行时,根据变量名与地址的对应关系,相应地存取变量的数据。这种按变量地址存取应关系,相应地存取变量的数据。这种按变量地址存取变量值的方法称为变量值的方法称为“直接访问直接访问”方式。方式。如如果果变变量量的的地地址址也也存存放放在在某某一一个个内内存存单单元元,则则存存取取方方式式为为先先找找到到存存放放变变量量的的地地址址单单元元,再再取取变变量量的的值值,这这种方式称为种方式称为“间接访问间接访问”方式。如:方式。如:p=&i;/将将变变量量 i 的的地地址址存存放放到到变变量量p
2、“指指向向”的的内内存存单单元元中中 /8.1.1.变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量*p=3;/将将3赋给指针变量赋给指针变量p所指向的变量所指向的变量 /变量的指针就是变量的地址变量的指针就是变量的地址,即,即p的值。也就是说的值。也就是说,指针变量的值就是指针变量的值就是该指针变量所指变量的内存首地址。该指针变量所指变量的内存首地址。在在p的前面加上一个的前面加上一个“*”,即,即*p就表示指针变量就表示指针变量p所指向的变量。所指向的变量。从右图可知从右图可知:*p也是一个变量,且与变量也是一个变量,且与变量 i 是同是同一回事。一回事。i=3;p=&i;p1,p2为指向整型变量为指向整型变量i,j的指针变量。即:的指针变量。即:p1=&i;p2=&j;说明说明:类型可以是整型、实型、字符型等。类型可以是整型、实型、字符型等。标识符前的标识符前的“*”表示该变量为指针变量。表示该变量为指针变量。指针变量只能指向指针变量只能指向同一类型的变量。同一类型的变量。上述的指针变量是上述的指针变量是p1、p2,而不而不是是*p1、*p2。*p1和和*p2是是p1
3、和和p2所指向的变量所指向的变量 i 和和 j。指针变量中只能存放地址。指针变量中只能存放地址。p1=100;*p1=&i;非法非法8.1.2指针变量的定义指针变量的定义定义形式:定义形式:类型标识符类型标识符 *标识符;标识符;指针变量必须定义为指针变量必须定义为“指针类型指针类型”。如:如:int i,j;int*p1,*p2;与指针有关的运算符:与指针有关的运算符:&取地址运算符。取地址运算符。如:如:&a为变量为变量a的地址。的地址。*指针运算符。指针运算符。如:如:*p为指针变量为指针变量p所指向的变量。所指向的变量。*运算和运算和&运算互为逆运算。运算互为逆运算。8.1.3 指针变量的引用指针变量的引用&p为指针变量为指针变量p的地址。的地址。&(*p)的结果为的结果为p,即变量即变量*p的地址。的地址。*(&i)表示访问变量表示访问变量 i 的地址,其结果就是的地址,其结果就是 i 本身。本身。p=&i;是将变量是将变量 i 的地址赋给指针变量的地址赋给指针变量p。指指针针变变量量p的的内内容容为为地地址址量量;*p为为指指针针p的的目目标标量量,内内容容为为数数据,即指
4、针变量据,即指针变量p所指向的变量的值。所指向的变量的值。*p=i;是将变量是将变量i的值赋给目标变量的值赋给目标变量*p。运行结果:运行结果:100,10100,10例例8.1main()int a,b;int*p1,*p2;a=100;b=10;p1=&a;p2=&b;/将变量将变量a和和b的地址赋给指针变量的地址赋给指针变量p1和和p2 /printf(“%d,%dn”,a,b);printf(“%d,%dn”,*p1,*p2);/*p1和和*p2就是变量就是变量a和和b /若先执行若先执行p1=&a;再执行再执行&*p1;是什么是什么意思?意思?这里这里“&”和和“*”的优先级相同,的优先级相同,但按但按“自右至左自右至左”结合结合,即即&*p1与与&a相同。相同。若先执行若先执行p1=&a;则则*&a和和*p1的作的作用相同。即:用相同。即:*&a与与a是等价的。是等价的。说明:说明:而而p2=&*p1;的作用是将的作用是将&a 赋给赋给p2。(*p1)+等价于等价于a+。注意注意:括号是必须的,否则就成括号是必须的,否则就成为为*(p1+)。这时先按这时先按p1的原值的原值
5、进行进行*运算得到运算得到a的值。然后使的值。然后使p1的值改变,则的值改变,则p1不再指向不再指向a了。了。注意:注意:此例中此例中a和和b并未交换,而并未交换,而p1和和p2的值改变。的值改变。例例8.2main()int*p1,*p2,*p,a,b;scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;printf(“a=%d,b=%dn”,a,b);printf(“max=%d,min=%dn”,*p1,*p2);运行情况:运行情况:5,9 a=5,b=9max=9,min=58.2 8.2 指针的运算指针的运算8.2.1 指针的算术运算主要为+-+-P+、p 分别表示向后、向前移一个单元。P+n、p-n 分别表示向后、向前移n个单元。8.2.2 指针的关系运算主要为=、!=两种。当两个指针p1与p2指向同一地址时,p1=p2为真,当两个指针p1与p2不指向同一地址时,p1!=p2为真。8.3.1 指向一维数组的指针指向一维数组的指针例例:int a10,*p;p=&a0;/将将a0元素的地址赋给指针变量元素的地址赋给指针
《指针的概念学习课件》由会员重生1****23分享,可在线阅读,更多相关《指针的概念学习课件》请在金锄头文库上搜索。
2024-05-02 929页
2023-11-09 192页
2023-11-09 126页
2023-11-09 80页
2023-11-09 50页
2023-11-09 57页
2023-11-09 81页
2023-11-09 68页
2023-11-09 96页
2023-11-09 66页