一维数组和数组元素的地址
一维数组和数组元素的地址
前言:定义的数组名可以认为是一个存放地址值的指针变量名,其中的地址是数组第一个元素的地址,也就是数组所占一串连续存储单元的起始地址。重要的是:这个指针变量中的地址值不可改变,也就是说,不可以给数组重新复制。因此,也可以认为数组名是一个地址常量。
如: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
-
-
-
void arrout(int *,int);
-
-
int arrin(int *);
-
-
int main()
-
{
-
-
ints[M],k;
-
k=arrin(s);
-
arrout(s,k);
-
return 0;
-
-
}
-
-
int arrin(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;
-
-
}
-
-
void arrout(int *a,int n)
-
{
-
-
int i;
-
for(i=0;i<n;i++){
-
printf("M",*(a+i));
-
}
-
-
}
-
当数组名作为实参时,对于的形参除了是指针wait,还可以用另外两种形式。当上面的提莫中数组名作为实参时,函数的首部用的是指针(*a),还可以用以下形式调用:
arrin(int *a)
arrint(int a[])//[]中不传值,可以理解为自适应
arrint (int a[M]) //M指具体数组长度,基本不使用数组这种方式,因为如果M的值穿小了,会造成溢出。
文章来源: czhenya.blog.csdn.net,作者:陈言必行,版权归原作者所有,如需转载,请联系作者。
原文链接:czhenya.blog.csdn.net/article/details/76092149
- 点赞
- 收藏
- 关注作者
评论(0)