惧留孙网

juliusun.com

在线教程 > C语言教程 > 指针与数组

指针与数组

第 25/50 节 冥河C语言教程


数组元素引用是通过数组名后面接方括号[]里面的下标来实现。C语言中,数组名表示的是数组首地址,如我们这样定义一个数组:


  1. int a[10]; //定义数组a

那么在定义之后,我们写的数组名a代表数组首地址。数组第一个元素的地址也是数组首地址。因此,在进行地址赋值或运行时,我们把&a[0]可以直接简写成a,如:


  1. int *p = &a[0];

可以直接简写成:


  1. int *p = a;

数组名的是地址,指名变量存储的也是地址。

数组名可以通过方括号[]运算符来访问某元素,指针也可以。指针是通过星号*运算符来访问。

如我要输出a数组下标为5的元素的值可以这样写:


  1. printf("%d", a[5] );

通过指针的写法是:


  1. printf("%d", *(p + 5) );

很好理解了。*p相当于*(p+0),表示从p存储的地址算起,第0个元素的内容,也就是p指向的内容。*(p + 1)表示从p存储的地址算起,第1个指向地址下一个地址。则*(p + N)表示从p存储的地址开始算起,第N个元素的值。

注意,由于运算符优先级关系*p+1表示,p指向的内容加1。会改变p指向的内容。而*(p + 1)表示的p存储的地址第1个元素的内容,不要记混。

当p = a完成赋值后,假设p的值不再改变,且N为整数,*(p + N)就等同于a[N]。数组和指针是可以连通的。

C语言内部,在处理数组下标时,也是通过地址偏移来实现的,如a[5],在内部,把a当作数组首地址,再加上5个元素占用空间的大小,来操作a[5]的值。和指针*(p+5)效果是一样的。现在大家可以理解了为什么C语言数组可以越界访问了吧。数组在内部也当作指针来处理,指针无所谓越界不越界,所以当然数组越界访问当然在语法上也不算错误。

事实上,他们联系不止这么多。指针和数组定义之后,除了数组名代表的地址不能改变外,在进行引用元素时,可以混用,如:


  1. a[5];

可以写成


  1. *(a+5);

同样:


  1. *(p + 5);

可以写成


  1. p[5]

上述代码还可写成:


  1. *(&a[0] + 5)

或:


  1. ( &a[0] ) [5]

因为在处理数组时,C内部也是通过指针偏移来得到的,所以数组下标从0开始也就很好理解了。数组名是一个内存地址,指针存储的也是内存地址,你可以通过这条规律来推测他们哪些方面可以通用。

再谈谈数组和指针一个不同的地方。当不作用参数时(作为参数时数组和指针联系和区别以后会讲),定义数组和指针,系统分配给他们的空间是不一样的。在32位系统下,指针类型无论指向什么类型,指针类型占用4个字节大小。而数组是每个元素的大小乘以元素个数。这一点可以通过 sizeof运算符 测试一下。

回到指针和数组联系,下面举个例子,用不同的方法实现一个数组元素的输出。

  1. #include<stdio.h>
  2. int main( )
  3. {
  4. int a[10] = {1,2,3,4,5,6,7,8,9,10};
  5. for(int i = 0;i < 10;++i)
  6. {
  7. printf("%d\n",*(a+i) /*或a[i],为了说明指针可以和数组混用以指针的方式写*/ );
  8. }
  9. getchar( ) ; //使程序暂停一下
  10. return 0;
  11. }

或:

  1. #include<stdio.h>
  2. int main( )
  3. {
  4. int a[10] = {1,2,3,4,5,6,7,8,9,10},*p = a;
  5. for(int i = 0;i < 10;++i)
  6. {
  7. printf("%d\n",*p);
  8. ++p;//改变指针,使指针指向下一个元素,也可与上一条语句合并,使用后置++运算符
  9. }
  10. getchar( ) ; //使程序暂停一下
  11. return 0;
  12. }

或:

  1. #include<stdio.h>
  2. int main( )
  3. {
  4. int a[10] = {1,2,3,4,5,6,7,8,9,10},*p = a;
  5. while(p <= &a[9]) //省略第三方变量i。地址也可比较大小,小于等于a[9]的地址,说明还没有超出数组界限,则循环。
  6. {
  7. printf("%d\n",*(p++));//先让指针参与运算,再改变指针值使其指向下一个元素
  8. }
  9. getchar( ) ; //使程序暂停一下
  10. return 0;
  11. }

效果类似如下图:

Pic

作者:冥河 QQ:3304576112
交流QQ群:554701039 C语言讲课群
本教程内容由本站保留版权,请勿复制传播
抖音
©2015-2024 惧留孙网 juliusun.com

京ICP备15039193号-1

首页 教程 下载 文章 聊天 我的