一维数组和数组元素的地址

来源:互联网 发布:linux设置文件权限777 编辑:程序博客网 时间:2024/05/18 01:31

一维数组和数组元素的地址
前言:定义的数组名可以认为是一个存放地址值的指针变量名,其中的地址是数组第一个元素的地址,也就是数组所占一串连续存储单元的起始地址。重要的是:这个指针变量中的地址值不可改变,也就是说,不可以给数组重新复制。因此,也可以认为数组名是一个地址常量。
如:float a[10],*p,x;
语句 a = &x; 或者 a++;这样的语句是非法的。因为不能给a重新赋地址值。一旦定义a永远指向a数组的首地址。
虽然不可以改变数组名a中的内容,但可以对数组名加一个整数的办法,来依次表达该数组中不同的元素地址。
如: int a[10],*p; p=a+4 也就是--> p =&a[4];
再如:for(k = 0;k<10;k++)
p=a+k;
在循环中并没有改变数组名中的内容,但通过表达式:a+k逐一给出了a数组中的每个元素的地址,使p一次指向a数组中和每一个元素。

如果 p = a 或 p=&a[0]这两个表达式所要表达的意思是一样的,都是指针P指向数组a的首地址。所以当要一次访问数组中的每一个元素可以用以下的两种形式:
p++;或a+k(k的值是不断变化的如上面的for语句一样)
通过数组的首地址引用数组元素
a是数组元素的首地址,a(即a+0)的是即等于&a[0],则用a+1的值等于&a[1]。 在以前我们学过“间接访问运算符”-----“ * ”来引用地址所占的存储单元,因此,对于数组a[0],可以用表达式*&a[0]来引用也可以用*(a+0),还可以用a[0]来表示。但需要注意的是对于*(p+k)这样的表达式不能写*p+k,这样写的话就错了。代表指针取值后再加K的值了。
总结:表示数组元素s[i] 的表达式应当有
s[i] *(s+i) *(p+i) *p[i]此时的p是指向s的首地址


例题:编写程序:通过给一个函数给主函数中定义的数组输入若干个大于等于0的整数,用负数作为输入结束标志,调用另一个函数中数组中的数据

#include
#define M 100

voidarrout(int *,int);
intarrin(int *);
intmain()
{
ints[M],k;
k=arrin(s);
arrout(s,k);
return 0;
}
intarrin(int *a)
{
inti,x;
i=0;
scanf("%d",&x);
while(x>=0)
{
//a[a+i]=x;
*(a+i)=x;
i++;
scanf("%d",&x);
}
return i;
}
voidarrout(int *a,int n)
{
inti;
for(i=0;i
printf("M",*(a+i));
}

当数组名作为实参时,对于的形参除了是指针wait,还可以用另外两种形式。当上面的提莫中数组名作为实参时,函数的首部用的是指针(*a),还可以用以下形式调用:
arrin(int *a)
arrint(int a[])//[]中不传值,可以理解为自适应
arrint (int a[M]) //M指具体数组长度,基本不使用数组这种方式,因为如果M的值穿小了,会造成溢出。




原创粉丝点击