- 1、本文档共30页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2第二讲 指针
第二讲 指针
1.指针的基本概念:指针≡地址;
2.指针常量:
某已知变量的地址,或数组名等,:int a,b[5];此时a和b就是指针常量(固定值)。
3.指针变量:如int a,*p=a; char s[9],*q=s;
赋值:必须赋地址值,如int a,*p; p=a;
如p=2001;是错误的。
4.间接访问:*p=5;等同于a=5;
5.指针作为函数的参数,传递的是实参变量的地址,
如:void func(int *p)
调用时用某变量的地址常量,或指向该变量的指针作为实参,如主调函数中有定义int a,*q;q=a;则可用a或q作为实参进行调用,即func(a);或func(q); 都是将变量a的地址传递给形参指针p,使指针p指向变量a。函数中使用*p就是对a的间接访问,就可以改变a的值,或者将结果放入a中。但形参变量本身改变,反过来不会影响实参指针值。
6.指针与一维数组:int a[10],*p=a;则a代表数组首地址,是指针常量,
元素的表示方法:a[i]、*(a+i)、 p[i]、*(p+i)
元素地址:a[i]、a+i、 p[i]、p+i
区别:a是指针常量,值不能变,而p是指针变量,可进行增减运算;所以常通过p的增减运算来快速访问数组a,如:
while(pa+5) scanf(“%d”,p++);
或while(pa+5) {(*p)++; printf(“%d,”,*p++);}
理解(*p)++、*p++、 *(p++)、p++的含义。
执行p++后指针拨动的单元数(由元素类型决定)
7.一维数组作为函数形参,实际上就是一个指针变量,如:func(int a[],int n);
等同于func(int *a,int n);
函数声明的几种变通形式。
所以指针a在函数中值可以改变,如*a++,不同于函数内定义的数组如:int b[5];这里b是指针常量。
8.指针与字符串:char *p,s[50]=“fdjfjdfj”; p=s;
可用p间接访问字符串,如指针法:for( ;*p!=‘\0’;p++) 或下标法:for(i=0;p[i]!=‘\0’;i++)
9.指针形参在函数间传递字符串:void copy(char *s1,char *s2) { while(*s1++=*s2++); }
调用时用字符数组名或指向某字符串的指针做实参,
如:char *p=“sdgygkh”; char ss[50]; func(ss,p) ;
函数调用的灵活形式:func(ss+2,p)或func(ss,p+2)
注意:输入字符串常用gets函数,但参数应是字符数组名,或已指向某字符数组的指针,如:char s[50],*p; gets(s);是正确的,而gets(p)是错误的,因为p没被赋地址值,无任何指向。改正:p=s; gets(p);
10.数组指针与多维数组:int a[3][4]; int (*p)[4]; p=a;
p指向a的一整行,此时*p就代表a[0];如果执行p++,则p指向下一行,即*p代表a[1],p跳过单元数为2*4=8个字节。
引用元素的两种形式:p[i][j]或(*p)[j]
几个等价关系式:由x[i]等价于*(x+i)和x[i]等价于x+i得出:
a[i][j]等价(*(a+i))[j]等价*(a[i]+j)等价*(*(a+i)+j)
a[i][j]等价*(a+i)+ j等价a[i]+j
指针形参在函数间传递多维数组:int func(int (*b)[4],int n); 等价于int func(int b[][4],int n);
调用时用二维数组名做实参,如:func(a,3);
11.指针数组:char *s[3];表示数组s有3个元素,每一个元素都是一个指针变量,都可以指向一个字符串。
赋初值:char *s[3]={“sdgg”,”ww”,”q”};或单独赋值:s[0]=“sdgg”;s[1]=“ww”;s[2]=“q”;
用于指向多个字符串。
也可用字符数组存储多个字符串,只是占用内存空间大。
11.指向指针的指针:二级指针,char **p;
用于访问指针数组,或在函数间传递指针数组,通常就是传递多个字符串。
12.char *s[3]={“sdgg”,”ww”,”q”};char **p; p=s;
p指向数组s的首地址,此时*p代表s[0],即指向第0个字符串,*p和s[0]都是第0个字符串的首地址,
可用gets(*p)或gets(p[i])来输入字符串,用puts(*p) 或puts(p[i])来输出字符串。
在函数间传递多个字符串的参数形式:func(char **s,int n)或fu
文档评论(0)