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;is+=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;ifor(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);
}