当前位置:   article > 正文

指针数组(指针类型的数组)

指针数组

顾名思义:指针类型的数组,首先是一个数组,数组元素存储的是指针。(中国的修饰词往往都在前面,而西方修饰词往往是放在后面)

语法如下:

目标类型 数组名称[元素个数]

如:int * p[3] 数组p有3个元素,每个元素存储的都是指针类型

  1. int a[] = {1, 3, 5}; //定义数组a
  2. int* p[3]; //定义指针数组p,有三个元素,每个元素存储都是指针类型
  3. p[0] = a; //或 &a[0]
  4. p[1] = &a[1]; //或 a+1
  5. p[2] = a + 2; //或 &a[2]

为什么 &a[0]和a是等价的呢?因为a在表达式中会转换为数组a首元素的首地址。

此时:

*p = *(p+0) = p[0] = a = &a[0] 这5个都是同数组a的首元素地址,只要用*号对它们运算,即得到数组第一个元素的值1

**p = *(*(p+0)) = *[p0] = *a = *(&a[0]) 这5个结果都是数值1


  1. #include <stdio.h>
  2. /*
  3. 时间:2022-04-28 15:31
  4. 作者:sgbl888
  5. 功能:指针数组
  6. 知识点:
  7. 1、指针类型的数组,首先是数组,数组元素存储的都是指针
  8. 2、数组名在表达式中会转换为数组首元素的首地址
  9. 3、对数组名使用sizeof关键字或对数组名取地址 &数组名 不会转换首元素的首地址
  10. */
  11. int main(){
  12. int a[] = {1, 3, 5};
  13. int *p[3]; //[]符高于其它运算符,p先与[3]组合。因此p[3]是一个有3个元素的int*(整型指针)的数组。简单点是就数组里面存储的都是指针类型
  14. p[0] = a; //或 a
  15. p[1] = a+1; //或 a+1
  16. p[2] = a+2; //或 a+2
  17. printf("p[3] sizeof: %zd Byte\n", sizeof p); //p三个元素都是int*指针,在64位系统占用8字节,三个元素共占用24个字节
  18. printf("%p %p %p\n", &a[0], &a[1], &a[2]); //打印三个元素的地址
  19. printf("%p %p %p\n", p[0], p[1], p[2]); //都是指向数组a的各个元素
  20. printf("%p %p %p %p %p\n", *p, *(p+0), p[0], a, &a[0]); //结果都是数组第一个元素的首地址
  21. printf("%d %d %d %d %d\n", **p, *(*(p+0)), *p[0], *a, *(&a[0])); //结果都是数值1
  22. return 0;
  23. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/223572
推荐阅读
相关标签
  

闽ICP备14008679号