指针知识点总结

指针常识点总结_文学_上等教化_教化专区。指针及其使用 指针及其使用 闭于指针的考点(12— 闭于指针的考点(12—24 分) : 指针与指针变量的观点、指针与地方运算符。 指针与指针变量的观点、指针与地方运算符。 变量、数组、字符串、函数、

指针及其使用 指针及其使用 闭于指针的考点(12— 闭于指针的考点(12—24 分) : 指针与指针变量的观点、指针与地方运算符。 指针与指针变量的观点、指针与地方运算符。 变量、数组、字符串、函数、布局体的指针,以及指向变量、数组、字符串、函数、 变量、数组、字符串、函数、布局体的指针,以及指向变量、数组、字符串、函数、 布局体的指针变量,通过指针援用以上百般型数据。 布局体的指针变量,通过指针援用以上百般型数据。 用指针作函数参数。 用指针作函数参数。 返回指针值的指针函数。 返回指针值的指针函数。 指针数组、指向指针的指针。 指针数组、指向指针的指针。 函数的号令行参数。 main 函数的号令行参数。 常识点归结: 常识点归结: 1.指针与指针变量的观点。 指针与指针变量的观点。 与指针变量的观点 (1)指针:即是内存中的一个存储单位的地方,即内存单位的编号。 指针: 即是内存中的一个存储单位的地方,即内存单位的编号。 单位的地方 指针变量:是一个能存放地方值 变量。通过它存放的地方值能间接拜候它 它存放的地方值能间接拜候 (2)指针变量:是一个能存放地方值的变量。通过它存放的地方值能间接拜候它 所指向的变量。 所指向的变量。 2.指针变量的界说。 针变量的界说。 类型名 *指针变量名 类型名 发言的有用类型, 暗示为指针型变量。 为指针型变量 类型解释中可取 C 发言的有用类型,* 暗示为指针型变量。如: *c1,*c2 char *c1,*c2; 是指针变量, 类型是字符型。 暗示 c1 与 c2 是指针变量,其基类型是字符型。 贯注:指针的基类型与其所指向的变量的类型要团结。 贯注: 指针的基类型与其 所指向的变量的类型要团结。 3.指针变量的 3.指针变量的操纵形式 指针变量 变量指向某个变量 ( (1)使指针变量指向某个变量, 即将某变量的地方值赋给指针变量)例: )使指针变量指向某个变量, 即将某变量的地方值赋给指针变量) int x; int *p= 或 int x ,*p; p= (2)用间址运算(运算符为*)拜候所指变量,例: )用间址运算( 运算符为 )拜候所指变量, *p=5;//用作左值期间表所指的变量 ; 用作左值期间表所指的变量 x=*p+9;//用作右值期间表所指变量的值 ; 用作右值期间表所指变量的值 贯注:指针变量正在操纵之前必定要指向某变量, 贯注:指针变量正在操纵之前必定要指向某变量,而不行用常数直接赋值 变量正在操纵之前必定要指向某变量 4.指针运算的优先级与团结性(首要涉及*、&、++、- -) 指针运算的优先级与团结性(首要涉及* ++、 。 运算的优先级与团结性 单目运算符优先级是一致的,但从右向左团结。 单目运算符优先级是一致的,但从右向左团结。 优先级是一致的 重心绪解: 重心绪解: 等同于&a &a。 (1)*&a 等同于 a; &*p 等同于&a。 (2)*p++等同于*(p++) *p++等同于* p++) 等同于 等同于*(++p) (3)*++p 等同于*(++p) (*p)++与 ( a++; p++) (4) *p)++与*(p++)的区别。 *p)++是变量值增值,相当于 a++;而*(p++) p++)的区别。 *p)++是变量值增值, 是变量值增值 则是用完如今值后,指针值增值, p++,是指向了新的地方。 则是用完如今值后,指针值增值,即相当于 a, p++,是指向了新的地方。 5.指针与一维数组(整型数组) 指针与一维数组(整型数组) 一维数组 (1)数组的地方:即数组中首个元素 a[0]的地方。 数组的地方: a[0]的地方。 的地方 取首元素的地方, (2)数组地方的暗示形式: (1)用数组名 a,(2)取首元素的地方,即&a[0] 数组地方的暗示形式: (1)用数组名 ,(2)取首元素的地方 数组指针:指向数组的指针变量的简称 的简称, 指针变量中存放的 中存放的是 (3)数组指针:指向数组的指针变量的简称,即指针变量中存放的是某数组的首 地方。 地方。例, 若有 int a[10],*p;p=&a;则可称 p 为 a 数组的指针,或称 p 指向数组 a。 a[10],*p;p=&a;则可称 数组的指针, (4)指针与数组的干系:通过挪动指针使其指向分歧的数组元素 指针与数组的干系: (p+1) (p+2), &a[0],&a[1],&a[2], &a[9]。 p, p+1) (p+2),…,(p+9) 等同于 &a[0],&a[1],&a[2],…,&a[9]。 (p+1 ,(p+2) , *p, p+1) (p+2), ,* a[0],a[1],a[2], a[9]。 *p,*(p+1) *(p+2),…,*(p+9) 等同于 a[0],a[1],a[2],…,a[9]。 , (5)总结:一维数组元素的合法援用格式 总结: 一维数组元素的合法援用格式 合法援用 格式一,数组名[下标] a[0],a[1], 格式一,数组名[下标], 比如 a[0],a[1],… 格式二,指针名[下标] [0], [1], 格式二,指针名[下标],比如 p[0],p[1],… 格式三, 指针名+下标) , *p,*(p+0),*(p+1), 格式三,*(指针名+下标) 比如 *p,*(p+0),*(p+1),… 格式四,*(数组名+下标) 比如 *a,*(a+0),*(a+1),… 格式四, 数组名+下标) , *a,*(a+0),*(a+1), 数组名即是第一个元素的地方,是以对数组的援用能够直接用*a (正在 C 中,数组名即是第一个元素的地方,是以对数组的援用能够直接用*a 暗示 a[0], *(a+1)暗示 a[1], *(a+2)暗示 a[2], *(a+9)暗示 a[9]。 a[0],用*(a+1)暗示 a[1],用*(a+2)暗示 a[2],…,用*(a+9)暗示 a[9]。 ) 6. 数组名或数组指针作函数参数 属于数组、指针、函数的归纳使用,贯注函数挪用时传值和传址的区别: 属于数组、指针、 函数的归纳使用, 贯注函数挪用时传值和传址的区别: 函数挪用时传值和传址的区别 (1)形参为遍及变量时是传值挪用 (2)形参为指针变量时是传址挪用 传值挪用(形参为遍及变量,挪用后形参不会影响实参) 例 1:传值挪用(形参为遍及变量,挪用后形参不会影响实参) #include stdio.h void fun(int a,int b) { a++; b++; } void main() { int x=3,y=4,z; fun(x,y); printf(%d,%d\n,x,y); printf(%d,%d\n,x,y); } 传址挪用(形参为指针,挪用后形参值影响实参 形参值影响实参) 例 2:传址挪用(形参为指针,挪用后形参值影响实参) #include stdio.h void fun(int *a,int *b) { (*a)++; void main() { int x=3,y=4,z; fun(&x, printf(%d,%d\n,x,y); printf(%d,%d\ } 传址挪用(形参为指针,可使用此类形参返回多个结果) 例 3 传址挪用(形参为指针,可使用此类形参返回多个结果) #include stdio.h void fun(int a,int b, int *c,int* d) *c, *d=a*b;} { *c=a+b; *d=a*b;} void main() { int x=3,y=4,k,j; x=3,y=4,k,j; k,j fun(x,y,&z, fun(x,y,&z, ,&j printf(%d,%d\n,k,j); printf(%d,%d\n,k,j); ,%d k,j } 例 4 传址挪用(形参为数组名) 传址挪用(形参为数组名) #include stdio.h b[],int void fun(int b[],int i) b[i]=0; { b[i]=0; } void main() { int a[10]={0,1,2,3,4,5,6,7,8,9}, i; fun(a,5); for (i=0;i10;i++) printf(%d,a[i]); (i=0;i10;i++) } 7.指针与一维数组(字符数组) 指针与一维数组(字符数组) 一维数组 用指针格式与用字符数组格式操作字符串的区别: 指针格式与用字符数组格式操作字符串的区别: 格式与用字符数组格式操作字符串的区别 (1)存储格式分歧。字符数组由若干个元素构成,每个元素中放一个字符,而字 存储格式分歧。 字符数组由若干个元素构成, 每个元素中放一个字符, 符指针变量中存放的是地方(字符串首个字符的地方) 首个字符的地方 , ,决不是将字符串放到字符 符指针变量中存放的是地方(字符串首个字符的地方) 决不是将字符串放到字符 (*b)++; } 指针变量中。 指针变量中。 (2)赋值格式分歧。 赋值格式分歧。 分歧 对字符数组只可对各个元素赋值,不行用以下手段对字符数组赋值。 对字符数组只可对各个元素赋值,不行用以下手段对字符数组赋值。 char str[20]; str=Good luck!; 而对字符指针变量,能够采用下面形式赋值: 而对字符指针变量,能够采用下面形式赋值: char *str; str=Good luck!; 的不是字符,而是字符串第一个元素的地方。 赋给 str 的不是字符,而是字符串第一个元素的地方。 (3)输入格式分歧。 输入格式分歧。 对字符数组可用如下格式赋值: 对字符数组可用如下格式赋值: 可用如下格式赋值 char str[20]; scanf(%s,str); //ok 但对字符指针变量则不发起用此格式,由于会发作指针的相当指向,无误做法为: 但对字符指针变量则不发起用此格式,由于会发作指针的相当指向,无误做法为: char *str,a[20]; str=a; //使指针有清楚的指向 //使指针有清楚的指向 scanf(%s,str); (4)字符指针变量的值是能够改换的,而字符数组名的值是不行够改换的。 字符指针变量的值是能够改换的,而字符数组名的值是不行够改换的。 指针变量的值是能够改换的 例 1:#include stdio.h void main() { *str=Good char *str=Good luck!; puts(str); str+=5; //ok str+=5; puts(str); } 例 2: #include stdio.h void main() { str[20]=Good char str[20]=Good luck!; puts(str); str+=5; str+=5; //error! puts(str); } 指针与二维数组 整型、字符型) 8. 指针与二维数组(整型、字符型) (1)二维数组的按行存储 若有 int a[2][3]={{1,2,3},{4,5,6}},*p=a; 则*(p+4)=a[1][1]=5 (2)二维数组元素的地方暗示及拜候格式 a[2][3],*p;p=&a; 设 int a[2][3],*p;p=&a; 可见 a 是 2×3 的数组, 的数组, 含有 6 个元素。 个元素。 能够为 a 有两个元素: 有两个元素: a[0]和 a[1]; a[0] a[0]和 a[1]; 而 a[1]又折柳是拥有三个元素的一维数组 又折柳是拥有三个元素的一维数组。 与 a[1]又折柳是拥有三个元素的一维数组。 a a[0]所含元素为: a[0][0],a[0][1],a[0][2]; a[0]所含元素为: a[0][0],a[0][1],a[0][2]; 所含元素为 a[1]所含元素为: a[1][0],a[1][1], a[1]所含元素为: a[1][0],a[1][1],a[1][2] 所含元素为 (能够影象为:二维数组 a 含有二个行元素,每个行元素又含有 3 个列元素) 能够影象为: 含有二个行元素, 个列元素) a[0]即&a[0][0], 行的首地方。 a[1]即是&a[1][0], 即是&a[1][0] 是以关于二维数组 a, a[0]即&a[0][0], 也即是第 0 行的首地方。 a[1]即是&a[1][0], 也即是第一行的首地方。 也即是第一行的首地方。 由地方运算规矩, 即是&a[0][0] &a[0][0], 即是&a[0][1] &a[0][1], 由地方运算规矩 , a[0]+0 即是 &a[0][0] , a[0]+1 即是 &a[0][1] , a[0]+2 即是 &a[0][2]。于是平常地:a[i]+j=&a[i][j]. &a[0][2]。于是平常地: 正在二维数组中,能够用指针暗示数组元素的地方, a[i]+j=&a[i][j]也可写为 正在二维数组中,能够用指针暗示数组元素的地方,如:a[i]+j=&a[i][j]也可写为 *(a+i)+j=&a[i][j] , 从 而 可 知 , *(*(a+i)+j) 就 是 a[i][j] , 即 a[i][j]= *(*(a+i)+j)。 *(*(a+i)+j)。 8.函数与指针 函数与指针 (1)指针动作函数参数(常识点 6) 指针动作函数参数( (2)函数的返回值为指针类型 界说格式为: 函数名( 界说格式为:类型 *函数名( ); 例:#include stdio.h int z; *fun(int int *fun(int x,int y) } { z=x+y; return } void main() { int a=3,b=4; int *c; c=fun(a,b); printf(%d\n,*c); printf(%d\n,*c); } (3)指向函数的指针变量 界说格式为: 变量名) ; (); 界说格式为: 类型 (*变量名) () 这里变量名前一个*号,解释该变量是指针变量,尔后面有括号解释这个指针变量 这里变量名前一个* 解释该变量是指针变量, 是指向函数的。 *p1) 是指针变量, 是指向函数的。如:int (*p1)( ); 解释 p1 是指针变量,这个指针变量是指向 函数的。 函数的。 9.指针数组与指向一维数组的指针变量 指针数组与指向一维数组的指针变量 (1)指针数组:一个数组,它的元素都为指针类型。 指针数组: 一个数组, 它的元素都为指针类型。 界说格式为: 数组名[整型常量表达式] 界说格式为:类型解释 *数组名[整型常量表达式] *s[4];则界说了一个指针数组, s[0],s[1],s[2],s[3]均用来存放地 如:char *s[4];则界说了一个指针数组,即 s[0],s[1],s[2],s[3]均用来存放地 址值,首要用于处分多个字符串。 址值,首要用于处分多个字符串。 (2)指向一维数组的指针:一个指针,指向一个一维数组 指向一维数组的指针: 一个指针, 界说方式是: 界说方式是:类型解释 (*变量)[整型常量表达式] 变量) 整型常量表达式] (*p)[4]; 指针变量,它指向的是一个拥有四个元素的一维数组。 如:int (*p)[4];界说 p 为指针变量,它指向的是一个拥有四个元素的一维数组。 10. 10.指向指针的指针 指向指针的指针也即是“二级指针”。 指向指针的指针也即是“ 二级指针” 界说格式如下: **指针变量名 界说格式如下:类型解释 **指针变量名 即界说一个二级指针变量, 即界说一个二级指针变量 , 类型解释是它指向的指针变量所指向的变量的数据类 型。它所指向的指针变量称为一级指针变量。 它所指向的指针变量称为一级指针变量。 赋值方式为:二级指针变量=&一级指针变量; 赋值方式为: 二级指针变量=&一级指针变量; =&一级指针变量 这相似于张三有李四的地方,而王五有张三的地方,如许王五通过张三找到李四。 这相似于张三有李四的地方,而王五有张三的地方,如许王五通过张三找到李四。 张三找到李四 如许张三是一级指针,而王五是二级指针。 如许张三是一级指针,而王五是二级指针。 比如: 比如: #include stdio.h void main() () []={ {char *name[] Follow me,BASIC,Great Wall″, [] , , , FORTRAN,Computer design}; , char **p; p;int i; p; for(i=0;i5;i++) ( ; ; ) { p=name+i; printf(″%s\n″,*p) ( ;} ; , ) ; } 10. 指针数组作 main 函数的形参 10. 函数的形参。正在以往的顺序中, 指针数组的一个紧急使用是动作 main 函数的形参。正在以往的顺序中,main 函数的 第一行平常写成以下方式: main()然而,main 函数能够有参数,比如: ()然而 第一行平常写成以下方式:void main()然而,main 函数能够有参数,比如:void 函数的形参。 main(int argc, char *argv[ ]) argc 和 argv 即是 main 函数的形参。 函数是由操作体系挪用的。 实质上实参是和号令一道给出的。 main 函数是由操作体系挪用的。实质上实参是和号令一道给出的。也即是正在一个命 令行中征求号令名和必要传给 main 函数的参数。 函数的参数。 号令行的平常方式为: 号令行的平常方式为: 号令名 参数1 参数2……参数 参数n 参数1 参数2……参数n 的文献, 函数: 假若有一个名为 file1 的文献,它包罗以下的 main 函数: main( argc, *argv[ ) void main(int argc,char *argv[ ] { while(argc1) {++argv; {++argv; printf(″%s\n″,argv) ; printf(″%s\n″,argv) --argc; } --argc; } argc 正在 DOS 号令形态下输入的号令活动: 号令形态下输入的号令活动: 输入的号令活动 file1 China Beijing 则实施以上号令行将会输出以下音讯: 则实施以上号令行将会输出以下音讯: China Beijing 11.相闭指针的数据类型的幼结 11. 界说 int i; int *p; ; int a[n]; int *p[n]; ; int (*p)[n]; ; int f( ); ; int *p( ); ; int (*p)( ); ; int **p; ; 寄义 界说整型变量i 界说整型变量i p为指向整型数据的指针变量 界说整型数组a,它有n 界说整型数组a,它有n个元素 a,它有 界说指针数组p,它由n 界说指针数组p,它由n个指向整型数据的指针元素构成 p,它由 p为指向含n个元素的一维数组的指针变量 为指向含n f为带回整型函数值的函数 p为带回一个指针的函数,该指针指向整型数据 为带回一个指针的函数, p为指向函数的指针,该函数返回一个整型值 为指向函数的指针, p是一个指针变量,它指向一个指向整型数据的指针变量 是一个指针变量,

  • 指针知识点总结已关闭评论
    A+
发布日期:2020年03月12日  所属分类:知识点