数组和指针的比较

数组和指针的比较

(1)指针变量的地址:指向内存中一个存储单元的第一个字节的地址。数组名的地址值,就是该数组的第一个元素的第一个字节的地址。

(2)指针变量有基类型,相当于数组的类型名。

(3)指针变量的地址值不可改变,即指针变量指向的存储单元的地址值是固定的,不可改变,如int *p,a;p=&a;则变量a的地址是不可改变的。也不可给数组名的地址重新赋值。如数组名为a的数组:a=&x;或a++等给数组名重新赋值都是错误的。一旦定义,a永远指向a数组的首地址。

(4)虽然不可改变a的内容(地址),但可以对数组名加一个整数的办法,来依次表达该数组中不同元素的地址。如:

 a  代表 &a【0】数组的首地址,也是a[0]的地址   //首地址

a+1 代表 &a【1】数组元素a[1]的地址   //在指针中,1代表一个存储单元

a+2 代表 &a【2】......   //注意:不是a=a+1,而是 a+1

 

例:

main()

{

    int a[10],*p,x,k;

    for(k=0;k<10;k++) p=a+k;  //a是数组的首地址,p=a+k;则遍历了数组中每个元素

    for (k=0;k<10;k++)  scanf("%d",a+k);    //输入每个元素的值

    for (k=0;k<10;k++)  printf("%d\n",a[k]);    //打印每个元素的值

    getch();

}

 

p=&a[0]; 等价于 p=a;

 

以下语句等价:

for(p=a,k=0;k<10;k++)  p++;//将数组a的首地址赋给指针p,k从0到9,p++将遍历数组中每个元素的地址。依次指向数组 a1,a2,a3......a9.

for(p=a,k=0;k<10;k++){scanf("%d",p);p++;}

for(p=a,k=0;k<10;k++)scanf("%d",p++);//什么 自加自减运算符,当++在后面时,当前表达式的值不变,元素加1.

for(p=a;p-a<10;p++)scanf(“%d”,p);

 

通过数组首地址 指针 带下标的指针引用一维数组元素。

引用一维数组中的某一个元素的方法:

*  :求当前地址的内容     & :求当前内容的地址

1  a【i】

2  *&a【i】  //*在定义语句时代表定义一个指针变量,当在执行语句部分时代表间址运算符,引用一个指针变量指向的地址的内容。&叫求地址运算符,求当前内容的地址。所以*和&就像乘号和除号一样,互相抵消了。

3  *(a+i):在数组名的地址上,加上i个存储单元。代表第(i+1)个元素,用间址运算符引用它,即等价于a[i]

4  当(p=a;||p=&a【0】)则 *(p+i)等价于a[i]

5  当(p=a;||p=&a[0])  则 p[i] 等价于 a[i]    //方括号不仅表示数组元素的记号,也是一种运算符.

 

总结:引用一维数组元素a[i] 的四种方法: a[i] *(a+i)  若p=a, 则 p[i] *(p+i)

表示a[i]的地址的方法:&a[i]  a+i p+i    都表示当前数组第i个元素的地址。

以下代表什么:

*(P--)   a[i--]  *--p   a[--i]

注:自加自减运算,p-- 等价于:m=p--  m=p   p=p-1 //先赋值,(先取值)再改变

               --p 等价于:m=--p  p=p-1 m=p  //先改变,再赋值。(再取值)

 

数组名a和指向数组的指针p的区别.前者不可变,不可运算,后者可以赋值,运算.

a++  是个赋值表达式

 

3)逐个输出a数组中元素的值.

for(k=0;k<10;k++)  printf("%4d",*(a+k));

for(k=0;k<10;k++)  printf("%4d",a[k]);

for(p=a,k=0;k<10;k++)  printf("%4d",*(p+k));

for(p=a,k=0;k<10;k++)  printf("%4d",p[k]);

for(p=a,k=0;k<10;k++)  {printf("%4d",*p);p++} //p++,即依次指向每一个元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值