- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
指针要点
指针要点
(重点,与数组、结构体结合起来综合考查)
地址:内存区的每一个字节有一个编号,这就是“地址”。
注意:内存单元的地址与内存单元的内容是两个概念。
指针变量:专门用来存放地址的变量。
和*优先级相同,但按自右而左方向结合。
1、指针变量的定义与赋值
指针变量只能指向相同类型的变量
例:int a,*p; float b;
则 p=a;正确 p=b 错误
2、指针指向字符串
指向方法 char *p=“string”;
表示指针变量p指向字符串开头
?有关运算 (与指向一维数组的运算相同)
p++表示指针指向下一个字符
*p++表示先得到字符s,然后指针再向下移动
例:(05春选择题26)D正确。选项C.p=Hello;p不再指向数组a,不能对数组a赋值,但可以*p=H;赋给a[0]。*(p+1)=e;……用循环逐个元素赋值。
例:char x[10];
scanf(%s,x);是正确的
但char *p;
scanf(%s,p);是错误的,p的值未定,键盘输入的字符串会放在已有指令或数据的存储区,很危险,可能破坏程序或数据。
改为:char x[10],*p=x;
scanf(%s,p);正确,p有了确定的值,键盘输入的字符串会放在该地址起始的存储单元。
3、指针指向一维数组
例: int a[10],*p;
则 p=a; p=a[0] ;p=a[i]; 正确 p=a 错误
注意:p++ *p++ *(p++) (*p)++的区别,若有 int a[10,*p=a;
则 p++表示p指向元素a[1]
*p++表示先得到p指向元素a[0]的值,然后p指向下一元素a[1]
*(p++)与*p++意义相同
(*p)++表示p所指向的元素a[0]的值自加1,p仍然指向a[0]?
例:int i; float a[6]={6,8,0,5,7,9};
float *p=a;等价于什么?改为:int *p=a;对不对?
printf(“%f”, ((p)++);输出什么?
printf(“%f”,*(p++)); *(p++)与*(p+1)是否同
printf(“%f”,*(p+4));
((p)++ 先输出a[0],再将a[0]加1,指针不变
*p++ 先输出a[0],指针指向a[1]
*(p+4) 输出a[5] ,指针不变
*p++等价于*(p++) 指针移动 p=p+1;赋值
不等价于*(p+1) 指针不动 不赋值
例:1、怎样引用a[i]的值?
2、如果p当前指向a[0]
p+3, a+3都等效于什么?
引用a[i]的值: a[i], ((p+i), ((a+i)
如果p当前指向a[0]
p+3, a+3都等效于a[3]
?一个指针所占的字节数是2B,下面定义的含义:
int *p[20];
int (*p)[20];
int *p();
int (*p)();
int **p;
int *p[20];定义20个数组元素的指针数组,p是指向指针的指针。
int (*p)[20];p是指向具有20列的二维数组的指针,*p是某行第一个元素的地址。p是指向指针的指针,p为行指针,p每加1增加40个字节。
int *p();p是一个函数名,该函数返回整型指针。
int (*p)();p是指向函数的指针,该函数返回整型值。
int **p; p是指向指针的指针。
4、指针指向二维数组(重点)
(1)多维数组的地址
int a[3][4]; a是以一行为变化单位的
a≡a+0≡a[0][0]
a+1代表第1行的首地址,a+i表第i行的首地址
a+i≡a[i][0]≡a[i]一维数组名(列地址)≡*(a+i) 列地址≡a[i]行地址
数组元素:a[i][j]≡*(a[i]+j)≡*(*(a+i)+j)
(2)指向多维数组的指针变量
①指向多维数组元素的指针变量
如实验书p56最后一题(以列为变化单位){t=*(p+3*i+j);*(p+3*i+j)=*(p+3*j+i);*(p+3*j+i)=t;}
n行m列的二维数组:a[i][j]的地址为a[0]+i*m+j
②指向由m个元素组成的一维数组的指针变量
p的增值以一维数组的长度为单位(以行为变化单位)
如:(*p)[4] 相当于a的变化,p为行指针
注意:行指针与普通指针的区别
?行指针定义形式: int a[3][4],(*p)[4],q;
?行指针意义:p为指向包含4个整型元素的一维数组的行指针,q为普通指针变量,把二维数组的每一行看作一维数组,用p的变
文档评论(0)