指针与数组(第一次写博,写些自己总结的东西)
来源:互联网 发布:网络借贷平台犯法吗 编辑:程序博客网 时间:2024/04/28 06:00
数组是c语言的核心,是c语言非常独特的地方,其中有很广泛用途之一的就是数组与指针,数组与指针中的各种*,&的运算经常使很多童鞋甚是烦恼,下面就让本人来讲解一些我自己总结的东西(我个人认为比书上写的好理解。。)。
1,首先是比较基本的指向数组的指针,和通过指针指针引用数组元素,这是两个是非常基础的内容,
for example: int a[10],*p;
p=&a[0];
这样就把a数组的0号元素a[0]的地址付给了指针变量p,此时p指向了a[0],
下面三行都是是等价的:int *p=&a[0];
int *p;p=&a[0];
int *p=*a;
通过指针引用数组元素的形式:for example:
#include<stdio.h>
int main()
{
int a[5]={1,2,3,4,5},*p;
for(p=a;p<a+10;p++)
printf("%d",p);
return 0;
}
我们要理解,一个数组的数组名其实就是指针,两者就是相同的。。。。
2,下面,来说比较麻烦一些的用数组名作函数参数
我们可以分出以下四类:1形参和实参都是数组名2实参用数组名形参用指针变量3实参形参都用指针变量4实参用指针变量形参用数组名。
1例:
#include<stdio.h>
int main()
{
int a[5]={1,2,3,4,5},i;
void f(int a[],int n);
f(a,5);
for(i=0;i<5;i++)
printf("%d",a[i]);
printf("/n");
return 0;
}
void f(int a[],int n)
{
int i,j,m=(n-1)/2,temp;
for(i=0;i<=m;i++)
{
j=n-1-i;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
return ;
}
2例:
#include<stdio.h>
int main()
{
int a[5]={1,2,3,4,5},i;
void f(int *x,int n);
f(a,5);
for(i=0;i<5;i++)
printf("%d",a[i]);
return 0;
}
void f(int *x,int n)
{
int *i,*j,*p,temp,m=(n-1)/2;
for(i=x,j=n-1+x,p=m+x;i<=p;i++,j--)
{
temp=*i;
*i=*j;
*j=temp;
}
return ;
}
3例:
#include<stdio.h>
int main()
{
int a[5]={1,2,3,4,5},i,*p=a;
void f(int *x,int n);
f(p,5);
for(i=0;i<5;i++)
printf("%d",a[i]);
return 0;
}
void f(int *x,int n)
{
int *i,*j,*p,m=(n-1)/2,temp;
for(i=x,j=n-1+x,p=m+x;i<=p;i++,j--)
{
temp=*i;
*i=*j;
*j=temp;
}
}
4例:
#include<stdio.h>
int main()
{
void sort(int x[],int n);
int *p,i,a[10];
p=a;
for(i=0;i<10;i++)
scanf("%d",a[i]);
p=a;
sort(p,10)
for(p=a,i=0;i<10;i++)
printf("%d",p++);
}
void sort(int x[],int n)
{
int ,i,j,k,t;
for(i=0;i<n;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(x[i]>x[k])k=j;
if(k!=i)
{
t=x[i];
x[i]=x[k];
x[k]=t;
}
}
}
我们来观察以下规律,从例1到例4,若形参变量相同(这里指都是数组名或都是指针变量,下同),则定义函数的形式相同(指都是通过定义数组形式或是都是定义指针变量形式),若实参变量相同,则输出形式可以相同,但也可以不相同,比如:实参变量都是指针变量,那么输出的形式可以是用数组元素,或用指针变量输出,若形参为指针变量,那么定义函数时也用指针变量,若形参为数组名,那么定义函数时,也用数组名来,总之,形参和定义函数形式有关。
3,多维数组与指针:
设a为一个二维数组的数组名,那么a代表的是a[0]的地址,即,二维数组a第0行的地址,而a[0]代表二维数组a[0][0]的地址,a[0],a[1],a[2]...............既是一维数组名,又代表a[0][0],a[1][0],a[2][0].....的地址,即&a[0][0],&a[1][0],&a[2][0]......,而第0行第1列的元素的地址应该用a[0]+1表示,也等价于*(a+0)+1,同理第一行第二个元素....说到这里就不得不说一下*,&这两个运算符了,&叫做取地址运算符,*叫做指针运算符(或称”间接访问“运算符),取其指向的内容,*,&的优先级别相同,但按自左而右的方向结合,那么*(a+0),&a[i],*(*(a+0)+1)....又是代表什么呢?
下面我来说一下我自己对*,&的理解:
*加上多维中其中一维的地址,那么它就表示紧接着下一维的地址或元素的地址,
*加上数组中一个元素的地址,那么它就表示数组中元素的值,
&加上数组中其中一维的的地址,那么它就表示与它相邻的上一维的地址,
&加数组中元素的地址,那么它就表示它上一维的地址,
&加上数组中元素(注意不是地址),那么它就表示此元素的地址,
&加上数组其中的一维(不是地址如&a[0]),那么它就代表这一维的首地址,
总结一下,如果把*理解为向正方向运算,那么&就可以理解为向反方向运算,(理解,有助于记忆),即,*进&退。
如此来说:
a 是二维数组名,指向一维数组a[0],即0行首地址,
a[0],*(a+0),*a 根据上述,a是0行首地址,那么加上*,就代表0行0列元素的地址,
a+1,&a[1] 根据上述,其代表第一行的首地址,
a[1],*(a+1) 根据上述,(a+1)代表第1行的首地址,那么*(a+1)就”进“一下,代表1行0列元素的地址,
a[1]+2,*(a+1)+2,&a[1][2] 代表1行2列元素的地址,其中,&a[1][2],a[1][2]代表1行2列的元素,根据上述,再加上&,就要退
一步,变为1行2列元素的地址,
*(a[1]+2),*(*(a+1)+2),a[1][2] 有上述可知,代表第一行第二列元素的值。
- 指针与数组(第一次写博,写些自己总结的东西)
- 第一次写博...发点东西
- 叹十年(自己写的东西)
- 第一次写点东西
- 第一次写点东西
- 第一次写东西
- csdn第一次写东西!
- 第一次写点东西
- 第一次写东西
- 第一次写东西
- 第一次写东西
- 第一次写东西
- 第一次写东西
- 第一次写东西
- 致第一次写博客的自己(为什么写博客)
- 自己写的堆排序。第一次写
- 第一次写自己的心得
- 第一次自己写的Tab
- 初来咋到
- php.ini安全模式配置详细解释
- 各大it公司笔试题分享
- magento -- 修正又一个翻译上的bug,同时了解了下Magento解析xml的方式
- 【转】shell's geek trick
- 指针与数组(第一次写博,写些自己总结的东西)
- TTL电平刷机
- 有关于BitmapEx 类的一些说明文件
- CPPUnit 总结
- Flex 开发地下城与勇士 设想
- Android For X86
- 在redhat图形界面与控制台的切换
- 稀疏线性系统求解算法 之 存储结构(MCRF) 强于二维数组、三元组、行压缩、修正行压缩等
- How to remove the icon of a WPF window