C语言指针.docx
- 文档编号:27491914
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:12
- 大小:62.86KB
C语言指针.docx
《C语言指针.docx》由会员分享,可在线阅读,更多相关《C语言指针.docx(12页珍藏版)》请在冰豆网上搜索。
C语言指针
指针
1.指针与内存变量
1>指针概念:
指针变量用于存储地址的内存变量
2>指针变量定义
intx;
int*p;int*是指针变量类型,说明p中存放地址
p=&x;x=*p
区分:
intp;
3>指针变量存放谁的地址,就称指针变量指向谁
作用:
可以间接访问指向对象
intx;
int*p;
p=&x;
直接访问:
x,x=90;
间接访问:
*p,*p=90;
&地址符p=&x;
*间接访问符*p=x;
4>指针变量的应用(指针与内存变量之间的关系)
例题1:
通过函数调用交换两个变量的值。
必须掌握值和地址传递的区别
三种情况分析:
传值:
形参的变化不影响实参
地址传递:
形参中的指针变量存放地址,有指向关系,可间接访问,加*则改变原始内容
地址传递:
交换地址,只是指向交换,没改变原始数据
例题1:
通过函数调用实现a、b之和放入c中
2
*a
Intc
3
*b
*a==2*b=3
总结:
结果返回
return返回
指针变量
2.指针与一维数组的关系
首先明确:
数组名表示数组的首地址
1>关系(画图分析)
inta[10],*p;a[0]a[1]a[2]……
p=a;表示指针变量p指向了一维数组a
*p==a[0];
p+1==&a[1];
2>作用:
间接访问数组a
直接引用数组元素:
a[i]*(a+i)
间接引用数组元素:
p[i]*(p+i)
3>输入输出
通过指针变量p间接访问元素对数组进行输入输出
输入:
for(i=0;i<10;i++)scanf(“%d”,p+i)&a[i],a+i,p+i,p++
输出:
for(i=0;i<10;i++)printf(“%d”,p[i]);a[i],*(a+i),*(p+i),*(p++)
分析:
*a+i(*p)++
考点:
inta[10]={1,2,3,4,5,6,7,8,9,0},*p;
p=&a[2];
printf(“%d”,p[2]);
指针变量指向数组中某一单元格的地址,则该存储单元的值就是p[0]的值
4>应用
例题:
通过函数调用的形式计算数组的累加和。
#include
fun(int*p,int*q)
{
inti,s=0;
for(i=0;i s+=p[i]; *q=s; } voidmain() { inta[10]={1,2,3,4,5,6,7,8,9,10},sum; fun(a,&sum); printf("%d",sum); } 3.指针与字符串的关系 1>关系(画图分析) chars[100],*p; p=s; p=&s[0]; 2>作用: 利用指针变量间接访问字符串 直接引用字符串元素: s[i]*(s+i) 间接引用字符串元素: p[i]*(p+i) 3>遍历字符串 字符串函数strlen(地址) gets(地址) puts(地址) strcpy(地址1,地址2) chars[10]=”abcefg”; chart[10]; strcpy(t,s);表示将s字符串的内容复制到t中 指针变量从起始地址开始输出,直到遇到’\0’结束 例题: 通过指针法对字符串进行逆置。 直接编写主程序 #include #include voidmain() { chars[10]={"abcdefg"},*p,*q,t; p=s; q=s+strlen(s)-1; while(p {t=*p; *p=*q; *q=t; p++; q--; } puts(s); } 通过函数调用完成 #include #include voidfun(char*p,char*q) { chart; while(p {t=*p; *p=*q; *q=t; p++; q--; } } voidmain() { chars[10]={"abcdefg"}; fun(&s[0],&s[strlen(s)-1]); puts(s); } 4.指针与二维数组的关系 1>通过建立一个指针数组引用二维数组元素 int*p[3],a[3][2],i,j; for(i=0;i<3;i++)p[i]=a[i]; 说明: p是一个数组名,系统将为他开辟3个连续的存储单元 *号说明数组p是指针类型,他的每个元素都是基类型维int的指针 分析 a 表示二位数组首地址 a+i 表示第i行行地址 *(a+i) 表示第i行第一个格格地址 *(a+i)+j 表示第i行第j列的格地址 *(*(a+i)+j) 表示第i行第j列的值 这时可以通过指针数组p来引用a数组元素: 指针数组变量名引用 数组名引用 p[i][j] a[i][j] *(p[i]+j) *(a[i]+j) *(*(p+i)+j) *(*(a+i)+j) (*(p+i))[j] (*(a+i))[j] 例如: #include voidmain() {ints[3][4]={{1,2,3,4}, {5,6,7,8}, {9,10,11,12} },i,j; int*p[3];//指针数组 //p=s;错误语句 for(i=0;i<3;i++)p[i]=s[i]; printf("%d,%d",p[1],s[1]); } 2>通过建立一个行指针引用二维数组元素 inta[2][3],(*prt)[3]; 说明: *号先与prt结合,说明prt是指针变量,然后再与说明符[3]结合,说明指针变量prt的集类型是一个包含有三个int元素的数组。 prt的类型与a的相同 prt=a是合法的赋值语句 prt+1等价于a+1 元素的引用 指针数组变量名引用 数组名引用 prt[i][j] a[i][j] *(prt[i]+j) *(a[i]+j) *(*(prt+i)+j) *(*(a+i)+j) (*(prt+i))[j] (*(a+i))[j] 例如: #include voidmain() {ints[3][4]={{1,2,3,4}, {5,6,7,8}, {9,10,11,12} },i,j; int(*prt)[4]; prt=s; //printf("%d,%d",prt,s); printf("%d,%d",prt[1],s[1]); //printf("%d,%d,%d\n",&s[1][0],s[1],prt+1); //printf("%d,%d",&s[1][2],prt[1]+2); } 以上元素的引用,上机边练习边掌握 例题: 打印杨辉三角 #include #defineN10 voidsetdata(int(*s)[N],intn) {inti,j; for(i=0;i {s[i][i]=1; s[i][0]=1; } for(i=2;i for(j=1;j s[i][j]=s[i-1][j-1]+s[i-1][j]; } voidoutdata(ints[][N],intn) {inti,j; printf("杨辉三角: \n"); for(i=0;i {for(j=0;j<=i;j++)printf("%4d",s[i][j]); printf("\n"); } } voidmain() {inty[N][N],n=7; setdata(y,n); outdata(y,n); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 指针