第10章指针 指针一C语言的精华
第10章 指针 指针----C语言的精华
10.1地址和指针的概念 内存用户数据区 指针就是地址。有变量的、数组的、函数 的、字符串的指针等 、内存的访问方式 1、直接访问 2000 如:i=2,j=6,k=9,通过变量i、j、k来2||。 访问存储单元。 2004 2、间接访问 如变量i,不知道其值及地址,而只知道302000 它的地址放在3010、3011中,因此可通过 存放地址的单元找到变量i的值,此为间接 访问。 对间接访问,可定义一变量存放地址,如 定义 ipointer,赋值 ipointer=&i
10 . 1 地址和指针的概念 指针就是地址。有变量的、数组的、函数 的、字符串的指针等。 一、内存的访问方式 1、直接访问 如:i=2, j=6, k=9 , 通过变量i、j、k 来 访问存储单元。 2、间接访问 如变量 i,不知道其值及地址,而只知道 它的地址放在3010、3011中,因此可通过 存放地址的单元找到变量 i 的值,此为间接 访问。 对间接访问,可定义一变量存放地址,如 定义ipointer, 赋值 ipointer=&i 2000 2002 2004 3010 i j k i_p 3 6 9 2000 : : : 内存用户数据区 : :
指针的概念 个变量的地址称为该变量的“指针” i的地址是2000,则地址2000是变量工的指针。 存放地址的变量叫“指针变量”,指针变量存放地址。 ipointer存放的是变量的地址。 i变量 ipointer指针变量 ipointer=&i
二、指针的概念 一个变量的地址称为该变量的“指针”。 i的地址是2000,则地址2000是变量I的指针。 存放地址的变量叫“指针变量”,指针变量存放地址。 ipointer存放的是变量I的地址。 i 变量 ipointer 指针变量 ipointer=&i
10.2变量的指针和指向变量的指针变量 、指针变量的定义 般形式:类型标识符*变量名 如:int*p char *p2i float *p3; 说明:(1)*表示指针型变量,意为“指向…的指针” (2)指针变量有确定的指向的数据类型。 思考:指针变量存放的是一个地址,为什么定义时需要指定类型?
10 . 2 变量的指针和指向变量的指针变量 一、指针变量的定义 一般形式: 类型标识符 *变量名 如:int *p1; char *p2; float *p3; 说明: (1) * 表示指针型变量,意为“指向…..的指针” (2) 指针变量有确定的指向的数据类型。 思考:指针变量存放的是一个地址,为什么定义时需要指定类型?
、指针变量的引用 1、给指针变量赋值(赋变量的地址) 如:p1=& 般不直接赋数值。 *p1的意义为p1所指向的变量i *p与等价,i=3,则*1也为3 注意:p1是地址变量,而*1是非地址变量,与等价 “*”:为指针运算符或叫指向运算符、间接运算符,为 单目运算符。 PI 2000 2000
二、指针变量的引用 1、给指针变量赋值 (赋变量的地址) 如: p1=&i 一般不直接赋数值。 *p1的意义为p1所指向的变量i; *p与i等价,i=3, 则*p1也为3。 注意:p1是地址变量, 而*p 1是非地址变量,与i等价。 “*”:为指针运算符或叫指向运算符、间接运算符,为 单目运算符。 2000 3 P1 *p1 i 2000
2、用指针变量对变量赋值 如:intI,j,*; =8] p=3 j=*p+2; 定义后 p=&l后 3后 *p+2后 1000 1000 1002 1002 1002 1002 1004 1004100 1004 1000 p1004
2、用指针变量对变量赋值 如: int I , j , *p; p=&I; *p=3; j=*p+2; 定义后 p=&I后 *p=3后 I j p : : : : 1000 1002 1004 I j p 1000 1002 1004 I j p 1000 1002 1004 I j p 1000 3 1000 1000 1002 1004 j=*p+2后 3 5 1000
例101 maino int a, b int *pointer, *pointer 2; a=100;b=10; pointer1=&a;/*把变量a的地址赋给 pointer1*/ pointer.2=&b;/*把变量b的地址赋给 pointer_2*/ printf(”%d,%Ⅶn”ra,b); printf(”%d,%dn”r* pointer1,为 pointer.2);
例10.1 main() { int a,b; int *pointer1, *pointer2; a=100;b=10; pointer1=&a; /*把变量a的地址赋给pointer_1*/ pointer2=&b; /*把变量b的地址赋给pointer_2*/ printf (”%d,%d\n”, a,b); printf(”%d,%d\n”, *pointer1,*pointer2); }
关于运算符&和*的几点说明: (1)结合性自右向左 如:inta,b,*p1,*2; 1=&a p2=&b &*p1=?相当于&(*p1)等于 &(*p1)=&(a)=&a=p1 *&a 相当于*(&a)=a (2)优先级处于第二位
关于运算符&和 * 的几点说明: (1)结合性 自右向左 如:int a, b, *p1, *p2; p1=&a; p2=&b; &*p1=? 相当于 &(*p1) 等于 &(*p1)=&(a)=&a=p1 *&a 相当于 *(&a)=a (2)优先级 处于第二位
(2)自增自减运算 如: int a, b,*pF p=&aa=3;b=5 (*p)++;相当于a++a==4 *p++;相当于*(p++) 若p为1000,则p++为1002 若 float a*p;p=&a 当p为1000则p++为1004 +与米同一级别,均为从右至左
(2) 自增自减运算 如: int a,b,*p; p=&a; a=3; b=5; (*p)++; 相当于 a++ a==4 *p++; 相当于 *(p++) 若p为1000, 则p++为1002 若float a,*p; p=&a; 当p为1000,则p++为1004 ++与*同一级别,均为从右至左
例[10.2]输入整数a和b,按大小的顺序输出 main ( int *p1,*p2, *p, a, be scanf( %d, %d", &a, &b); p1=&al;p2=&b; if (a<b Rp=p1; pl=p2; P2=piy printf("Mna=%db=%dⅦn”,a,b); printf ("max=%d, min=%d\in",*pl, *p2);
例[10.2]输入整数a和b,按大小的顺序输出。 main ( ) { int *p1, *p2, *p, a, b; scanf("%d,%d",&a,&b); p1=&al; p2=&b; if (a<b) {p=p1;pl=p2;p2=p;} printf ("\na=%d,b=%d\n” ,a,b); printf("max=%d,min=%d\n", *pl, *p2); }