C语言:指针变量

上传人:飞*** 文档编号:53052317 上传时间:2018-08-27 格式:PDF 页数:7 大小:12.41KB
返回 下载 相关 举报
C语言:指针变量_第1页
第1页 / 共7页
C语言:指针变量_第2页
第2页 / 共7页
C语言:指针变量_第3页
第3页 / 共7页
C语言:指针变量_第4页
第4页 / 共7页
C语言:指针变量_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《C语言:指针变量》由会员分享,可在线阅读,更多相关《C语言:指针变量(7页珍藏版)》请在金锄头文库上搜索。

1、 C语言: 指针变量声明指针变量 :基数据类型 * 指针变量名如 int *p ;例:int *p1, *p2;p1和p2是 int型指针变量,可以指向int型变量或 int数组元素。char *p3 ; p3是 char 型指针变量,可以指向char 型变量或 char 数组元素。指针变量可用来表示它所指向的变量(或数组元素)。所指向变量的数据类型必须和指针变量的基数据类型相同。(注:还可声明指向数组、结构、和函数等的指针变量。)为了让指针变量指向某一变量,须把该变量的地址赋给这个指针变量:指针变量 = p=也可以把一个指针变量如p1 的值赋给另一指针变量如p2:p2=p1,只要它们有相同的

2、基数据类型。此时,p2 和 p1 指向同一变量:指针变量 1 = 指针变量 2 如 int k, *p1,*p2; p1= p2=p1;例: int k, n, a10, *p1, *p2 ; char c, s20, *p3, *p4, *p5 ;p1 = p2 = p3 = p4 = p5 = p4; 为引用指针变量所指向的变量,只须在该指针变量前加一星号: * 指针变量,如 *p 。例如, int k,*p; p=接上例:* p1 = 100; /* 同 k=100; */ n = *p1 + 5 ; /* 同 n=k+5; */ *p4 = A ; /* 同 s0= A ; */ s1

3、=*p4; /* 同 s1=s0; */ 对指向数组元素的指针变量,可以做整数加减法: 指针变量 整数如p2=p1+1;例如,设 p1 指向 ai:p1= 则 p1+m指向 ai+m, 即 *(p1+m) 是 ai+m。例: int *p1,*p2, a10=0,1,2,3,4,5,6,7,8,9;p1= /* 也可写成p1= 或 p1=a; */ p2=p1+8; /* p2指向 a8, 同 p2=/* 输出 0,8,8 */ 注意, 数组名本身就代表数组首元素的地址,即:设 a 是数组,则a , *S = PI*r*r; void Swap( int *x, int *y ) /* 交换两

4、整型变量的值 */ int t; t = *x; *x = *y; *y = t; main() int a,b, *p1, *p2, c10=0,1,2,5,4,3,6,7,8,9; double L1,S1,*p3,*p4; a=5; b=6; p1= p2= Swap(p1, p2) ; /* or Swap( a=6,b=5 */ p1= p2= Swap(p1,p2) ; . /* c3=3,c5=5 */ p3= p4= Circle(2.5, p3,p4); /* L1=周长, S1=面积 */ 多维数组情形对于一维数组a ,C 语言把(a+i) 解释为 ai的地址。但对于多维数

5、组a,C 语言对(a+i) 的解释是不同的。例如设有二维数组amn和指向数组元素的指针变量p, 置 p=a 。此时:a+i ,*(a+i), ai, 令 p=a 或 p=a0, 则*(p+i)是一维数组ai(的首地址) ,即一维数组a 的行 i ,有 20 个元素。 i = 0, 1, , 9。*(*(p+i)+j)是元素 aij, 因为*(p+i)是 ai,即 第 i 行的首地址 ,即 A10,A11,A12,A13,A14; A20,A21,A22,A23,A24于是,以下语句将求出15 个元素之和:int s=0,k, *p; for (p=A; p=0 m-) for (m=n; mF

6、rom; m-) if (Am-1Am) /* 降序 if(Am-1 *(p+m) SwapD( k=m; SwapD(p+m-1,p+m); k=m; From = k; From = k; main() double a110=1,4,3,2,9,10,7,8,5,6; double a210=1,4,3,2,9,10,7,6,5,8; int i; Sort1(a1,10); for (i=0;i /* clrscr() */ char * substr( char *dest, char *str, int begin, int n ) /* 截取 str的从 begin 开始共(至多

7、) n 个字符到 dest 中,并返回指向dest 的指针。 */ /* begin=1, n=0. 若 str是空串或 n=0 则 dest 是空串。容许dest=str */ int i; char c ; begin=begin-1; for (i=0;i=0 */ return substr( dest, str, 1, n ); main() char s120,s220,*p1,*p2; clrscr(); /* 清屏 from */ substr(s1,” abcdefgh ” , 1, 20) ; /* 同 strcpy(s1,” abcdefgh ” ) */ p1=s1;

8、printf(“ %sn” ,p1); printf(“ %sn” ,s1); /* 输出 s1: “ abcdefgh ” */ p2=leftstr(s2,s1,5); /* 同 p2=leftstr(s2,p1,5) */ printf(“ %sn” ,p2); /* 输出 p2: “ abcde” */ printf(“ %sn” , substr(s2,s1,3,4); /* 输出 s2: “ cdef ” */ printf(“ %sn” , leftstr(s2,s2,2); /* 输出 s2: “ cd” */ 关于字符串常数作实参:注意,若形参是字符数组或字符型指针变量,实参

9、也可以是字符串常数,如strcpy(s1,“ abcdefgh ” ); 因为字符串常数在C中,实际上是用字符数组(在数据段)存放的。你虽然写的是字符串常数实参,C传递给形参的仍是存放该字符串常数的首地址。但是,若形参数组在函数体中被赋值,则用字符串常数作实参有时会带来不可预定的后果(与数组下标超界的错误类似)。顺便指出,可以在函数头中指针形参前加关键字 const , 明显地禁止函数体修改该指针指向的变量(若赋值则 Compile 报错)。例如,库函数 strcpy()的原型是:char * strcpy ( char *dest, const char *source)显然,对于 cons

10、t 字符数组形参,用字符串常数作实参总是不会引起问题。但若使用以下这样的函数调用,则要格外当心: strcpy(“ abc” ,s1) 。多维数组参数 : 如果函数的参数是多维数组, C要求指定形参数组的除第一维以外的其他各维的上界, 如: a10。只有这样,才允许在函数体内使用下标法,如 aij,来引用数组元素。 (因这时可以计算出aij的地址为 a+i* 10+j 。 )但因为多维数组总可作为一维数组对待,所以形参数组也可写成a,或指针 *a 。此时在函数体内应该用地址法,如 * (a+i*n+j),引用数组元素aij, 其中 n 是第二维的上界。而实参仍可用二维数组名。例. 求 n 阶方

11、阵对角线元素之和: double trans(double *a,int n) /* 或 double a ,虽然 a 是二维数组 */ int i;double s=0; for (i=0;i0. */ int i; double x,h=0.05,area; x=a; area=0; while (1) if (x+hb) h=b-x; area = area + (*f)(x) * h; /* 或 area = area + f(x) * h; */ x=x+h; if (absD(x-b) /* strlen( char *) */ #include /* itoa(int, char

12、 * ,int radius) */ /* char * itoa (int i,char*dest,int radix); int整数 - radix(2,8,10,16)进制字符串 */ char * substr(char *dest,char *str,int begin,int n) /* 见上 */char * leftstr(char * dest, char * str,int n) return substr( dest, str, 1, n ); char * rightstr(char * dest, char * str,int n) /* n=0 */ int i,l

13、en; len=strlen(str); if (len=n) for (i=0;i=n-1;i+) *(dest+i)=*(str+i); else for (i=1;i=len;i+) *(dest+n-i)=*(str+len-i); for (i=0;in-len;i+) *(dest+i)=c; *(dest+n)=0; return dest; char * padleft(char * dest, char * str,int n) return padleftchar(dest,str,n, ); char * inttostr(int i, char * dest, int n) itoa(i,dest,10); if (strlen(dest) != n) padleftchar(dest,dest,n, ) ; return dest; char * inttostrzero(int i, char * dest, int n) itoa(i,dest,10); if (strlen(dest) != n) padleftchar(dest,dest,n,0) ; return dest;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号