chp10指针知识点总结.docx
- 文档编号:12870932
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:15
- 大小:20.71KB
chp10指针知识点总结.docx
《chp10指针知识点总结.docx》由会员分享,可在线阅读,更多相关《chp10指针知识点总结.docx(15页珍藏版)》请在冰豆网上搜索。
chp10指针知识点总结
指针及其应用
关于指针的考点(12—24分):
✧地址、指针与指针变量的概念
✧指针与普通变量
✧指针与一维数组(整型数组)
✧指针与一维数组(字符数组)
✧指针作函数参数
✧指针作函数的返回值类型
✧指针指向函数
✧指针数组、指向指针的指针
✧指针与动态内存分配
✧main函数的命令行参数
知识点归纳:
一、地址、指针与指针变量的概念。
1.地址、指针:
就是内存中的一个存储单元的地址,即内存单元的编号。
2.指针变量:
是一个能存放地址值的变量。
通过它存放的地址值能间接访问它所指向的变量。
二、指针与普通变量
1.定义指针变量。
定义形式:
基类型名*指针变量名
基类型可取C语言的有效类型,*表示为指针型变量。
如:
char*c1,*c2;//表示c1与c2是指针变量,其基类型是字符型。
注意:
指针的基类型与其所指向的变量的类型要统一。
2.使指针变量指向普通变量(p->x)
即将某变量的地址值赋给指针变量,例:
intx;int*p=&x;//定义同时赋值
或
intx ,*p;p=&x ;//先定义,后赋值
3.通过指针访问所指变量——间址运算(运算符为*),例:
*p=5;//用作左值时代表所指的变量
x=*p+9;//用作右值时代表所指变量的值
注意:
指针变量在使用之前一定要指向某变量,而不能用常数直接赋值
4.指针运算的优先级与结合性(主要涉及*、&、++、--)。
单目运算符优先级是相同的,但从右向左结合。
重点理解:
(1)*&a等同于a;&*p等同于&a。
(2)*p++等同于*(p++)
(3)*++p等同于*(++p)
(4)(*p)++与*(p++)的区别。
(*p)++是变量值增值,相当于a++;而*(p++)则是用完当前值后,指针值增值,即相当于a,p++,是指向了新的地址。
三、指针与一维数组(整型数组)
1.数组及数组元素的地址:
(1)数组地址:
a(数组名)或&a[0](首元素的地址)。
(2)数组元素的地址:
&a[0],&a[1],&a[2],&a[3],…
2.指向数组元素的指针变量:
即指针变量中存放的是数组元素的地址。
例,
inta[10],*p;p=&a[0];//p指向数组元素a[0],也可用p=a。
p=&a[3];//p指向数组元素a[3]
3.指针与数组的关系:
通过移动指针使其指向不同的数组元素
(1)指针与元素地址间的对应关系:
p,(p+1),(p+2),…,(p+9)等同于&a[0],&a[1],&a[2],…,&a[9]。
(2)指针与元素间的对应关系:
*p,*(p+1),*(p+2),…,*(p+9)等同于a[0],a[1],a[2],…,a[9]。
(3)一维数组元素的合法引用方式:
方式一,数组名[下标],例如a[0],a[1],…
方式二,指针名[下标],例如p[0],p[1],…
方式三,*(指针名+下标),例如*p,*(p+0),*(p+1),…
方式四,*(数组名+下标),例如*a,*(a+0),*(a+1),…
注意:
p和a的用法基本相同,但它们有一个本质的区别:
p是变量,而a是常量,因此,p+1,a+1或p++是合法的,a++则是不合法的。
四、指针、数组指针或数组名作函数参数
属于数组、指针、函数的综合应用,注意函数调用时传值和传址的区别:
(1)形参为普通变量时是传值调用
(2)形参为指针变量时是传址调用
例1:
传值调用(形参为普通变量,调用后形参不会影响实参)
#include
voidfun(inta)
{a++;}
voidmain()
{
intx=3;
fun(x);
printf("%d\n",x);答案3
}
例2:
传址调用(形参为指针,调用后形参值影响实参)
#include
voidfun(int*a)
{(*a)++;}//若改为a++结果会如何?
答案3
voidmain()
{
intx=3;
fun(&x);
printf("%d,%d\n",x);答案4
}
例3传址调用(形参为指针,可利用此类形参返回多个结果)
#include
voidfun(inta,intb,int*c,int*d)
{*c=a+b;*d=a*b;}
voidmain()
{
intx=3,y=4,k,j;
fun(x,y,&k,&j);
printf("%d,%d\n",k,j)
}答案7,12
例4传址调用(形参为数组名,调用后形参值影响实参)
#include
voidfun(intb[],inti)
{b[i]=0;}
voidmain()
{
inta[10]={0,1,2,3,4,5,6,7,8,9},i;
fun(a,5);
for(i=0;i<10;i++)printf("%d",a[i]);
}答案0123406789
五、指针作函数的返回值类型
1.函数的定义方式:
类型*函数名();
对比:
double*fun1();//定义函数fun1,其返回值类型为指针型,该指针指向double型数据
doublefun2();//定义函数fun2,其返回值类型为double型
2.应用示例:
#include
intz;
int*fun(intx,inty)
{z=x+y;return&z;}
voidmain()
{
inta=3,b=4;
int*c;
c=fun(a,b);
printf("%d\n",*c);
}答案7
六、指针指向函数
1.指向函数的指针变量的定义方式:
类型(*变量名)();
说明:
*号,说明该变量是指针型变量
括号,说明这个指针变量是指向函数的
例如:
int(*p1)();//定义p1为一指针变量,这个指针变量是指向函数的。
2.应用示例:
#include
voidmain()
{intmax(int,int);
int(*p)(int,int);//定义指向函数的指针p,注意括号内的参数类型
inta,b,c;
p=max;//使p指向函数max
scanf("%d,%d",&a,&b);
c=(*p)(a,b);//用指针p调用函数,等同于c=max(a,b);
printf("a=%d,b=%d,max=%d\n",a,b,c);
}
max(intx,inty)
{returnx>y?
x:
y;}若输入12,23,得到结果为12,23,23
3.几个易于混淆的定义方式:
intp();//p为函数名,其返回值为整型
int*p();//p函数名,其返回值为指针型,该指针指向整型数据
int(*p)();//p指针变量名,该变量指向某个函数,该函数返回一个整型值
七、指针与一维数组(字符数组)
用指针方式与用字符数组方式操作字符串的区别:
(1)存储方式不同。
字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串首个字符的地址),决不是将字符串放到字符指针变量中。
(2)赋值方式不同。
对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值。
charstr[20];
str="Goodluck!
";
而对字符指针变量,可以采用下面方法赋值:
char*str;
str="Goodluck!
";
赋给str的不是字符,而是字符串首个元素的地址。
(3)输入方式不同。
对字符数组可用如下方式赋值:
charstr[20];
scanf("%s",str);//ok
但对字符指针变量则不建议用此方式,因为会发生指针的异常指向,正确做法为:
char*str,a[20];
str=a;//使指针有明确的指向
scanf("%s",str);
(4)字符指针变量的值是可以改变的,而字符数组名的值是不可以改变的。
例1:
#include
voidmain()
{
char*str="Goodluck!
";
puts(str);
str+=5;//ok
puts(str);答案Goodluck!
luck!
}
例2:
#include
voidmain()
{
charstr[20]="Goodluck!
";
puts(str);
str+=5;//error!
puts(str);
}
六、指针与二维数组
1.二维数组元素的存储方式:
按行存储(线性存储)
例:
若有inta[2][3]={{1,2,3},{4,5,6}},*p=&a[0][0];A[][]012
则*(p+4)=a[1][1]=50123
2.二维数组的组成方式:
1456
设inta[2][3],*p;p=&a;
a数组有两个元素:
a[0]和a[1];而a[0]与a[1]又分别是具有三个元素的一维数组。
aa[0]所含元素为:
a[0][0],a[0][1],a[0][2]
a[1]所含元素为:
a[1][0],a[1][1],a[1][2]
3.二维数组元素地址的表示方式:
a或a+0或a[0]或a[0]+0或&a[0][0],数组a[0]的首地址、元素a[0][0]的地址。
a+1或a[1]或a[1]+0或&a[1][0],数组a[1]的首地址、元素a[1][0]的地址。
一般地有:
a+i或a[i]或*(a+i)表示数组a[i]的首地址
a[i]+j或&a[i][j]或*(a+i)+j表示元素a[i][j]的地址
表示形式
含义
a
二维数组名,指向一维数组a[0],即0行首地址
a[0],
*(a+0),
*a
0行0列元素地址
a+1,&a[1]
1行首地址
a[1],*(a+1)
1行0列元素a[1][0]的地址
a[1]+2,
*(a+1)+2,
&a[1][2]
1行2列元素a[1][2]的地址
*(a[1]+2),
*(*(a+1)+2),
a[1][2]
1行2列元素a[1][2]的值
4.二维数组元素的表示方式:
下标法:
a[i][j]
地址法:
*(*(a+i)+j)或*(a[i]+j)
七.指针数组与指向数组的指针变量
1.指针数组:
一个数组,它的元素都为指针类型。
定义方式为:
类型说明*数组名[整型常量表达式]
如:
char*s[4];//定义数组s,4个元素s[0],s[1],s[2],s[3]均为指针型变量
作用:
主要用于处理多个字符串。
对比:
单个指针与指针数组
例1:
#include
voidmain()
{char*str1="china",*str2="america",*str3="japan";//分别定义3个指针型变量
puts(str1);
puts(str2);
puts(str3);
}
例2:
#include
voidmain()
{
inti;
char*str[3]={"china","america","japan"};//同时定义3个指针型变量
for(i=0;i<3;i++)puts(str[i]);
}
2.指向数组的指针:
一个指针,其基类型为一个数组
定义形式是:
类型说明(*变量)[整型常量表达式]
如:
int(*p)[4];定义p为指针变量,它指向的是一个具有4个元素的一维数组。
八.指向指针的指针
指向指针的指针也就是“二级指针”。
定义方式如下:
类型说明**指针变量名
即定义一个二级指针变量,类型说明是它指向的指针变量所指向的变量的数据类型。
它所指向的指针变量称为一级指针变量。
赋值形式为:
二级指针变量=&一级指针变量;
这类似于张三有李四的地址,而王五有张三的地址,这样王五通过张三找到李四。
这样张三是一级指针,而王五是二级指针。
例如:
#include
voidmain()
{char*name[]={"Followme","BASIC","GreatWall″,
"FORTRAN","Computerdesign"};
char**p;inti;
for(i=0;i<5;i++)
{p=name+i;printf(″%s\n″,*p);}
}
九、指针与动态内存分配
1.静态分配与动态分配的区别:
(1)静态分配的内存空间需预先给定,动态分配的内存空间可在运行时确定。
(2)静态分配的空间要到程序结束才被释放,动态分配的空间在用完后就可释放。
2.动态内存分配函数:
(1)malloc函数
函数原型:
void*malloc(unsignedintsize);
作用:
在内存的动态存储区中分配一个长度为size的连续空间。
返回值:
成功则返回指向分配域起始地址的指针。
未成功则返回空指针(NULL)。
(2)calloc函数
函数原型为:
void*calloc(unsignedn,unsignedsize);
作用:
在内存的动态存储区中分配n个长度为size的连续空间。
返回值:
成功则返回一个指向分配域起始地址的指针;不成功,返回NULL。
(3)free函数
函数原型为:
voidfree(void*p);
作用:
释放由p指向的内存区。
返回值:
无。
注意:
malloc()函数的返回值是一个void型指针,其特点是可以指向任何类型的数据。
在实际使用malloc()函数时,必须将其返回值强制转换成被赋值指针变量的数据类型
3.应用示例
#include
voidmain()
{
int*p;
double*q;
p=(int*)malloc(sizeof(int));
q=(double*)calloc(10,sizeof(double));
*p=3;
*q=1.4;q++;*q=2.5;
printf("%d\n",*p);
free(p);
printf("%f\n",*--q);
free(q);
}答案31.400000
十、指针数组作main函数的形参
1.程序的命令行执行方式:
命令名[参数1][参数2]……[参数n]
例如:
copyf1.txtf2.txt
2.带参数的main函数:
voidmain(intargc,char*argv[])//argc和argv就是main函数的形参。
3.命令行参数与main函数参数间的关系:
(1)由操作系统调用main函数
(2)将命令行参数作为实参传递给main函数的形式
(3)具体传递方式:
参数的个数(包括程序名在内)->argc
参数字符串(包括程序名在内)->*argv[]
4.应用示例:
如果有一个名为file1的文件,它包含以下的main函数:
voidmain(intargc,char*argv[])//argv为指针数组
{while(argc>1)
{++argv;puts(argv);
--argc;}}
若在DOS命令状态下输入的命令行为:
file1ChinaBeijing
则执行以上命令行将会输出以下信息:
China
Beijing
有关指针的数据类型的小结
定义
含义
inti;
定义整型变量i
int*p;
p为指向整型数据的指针变量
inta[n];
定义整型数组a,它有n个元素
int*p[n];
定义指针数组p,它由n个指向整型数据的指针元素组成
int(*p)[n];
p为指向含n个元素的一维数组的指针变量
intf();
f为带回整型函数值的函数
int*p();
p为带回一个指针的函数,该指针指向整型数据
int(*p)();
p为指向函数的指针,该函数返回一个整型值
int**p;
p是一个指针变量,它指向一个指向整型数据的指针变量
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- chp10 指针 知识点 总结