当前位置:   article > 正文

c语言之——指针数组与数组指针_指针数组和数组指针的定义

指针数组和数组指针的定义

一、指针数组和数组指针的定义

1. 指针数组:是指一个数组里面装着指针,也即指针数组是一个数组;

定义形式:int *a[10];

说明[]优先级高于*,该定义形式应该理解为:int * (a[10]);括号里面说明a是一个数组,包含了10个元素,括号外面说明每个元素的类型为int *。

如图所示:

2. 数组指针:是指一个指向数组的指针,它其实还是一个指针,只不过是指向数组而已;

定义形式:int (*p)[10]; 其中,由于[]的优先级高于*,所以必须添加(*p).

说明括号中的*表明 p 是一个指针,该指针变量保存的是一个数组的首地址,它指向一整个数组(),数组的类型为int[10],这正是 a 所包含的每个一维数组的类型。

在32位系统下任何类型的指针所占内存大小都为4个字节,至于它指向的数组占多少字节,具体要看数组的大小。总之,数组指针即为“指向数组的大小”
 

总结:主要看后面的两个字是什么(前面是修饰作用),因此指针数组是数组,而数组指针是指针。
 

二、指针数组和数组指针的使用

1. 指针数组的使用

(1)最简单的使用方式:

  1. #include <stdio.h>
  2. int main(){
  3. int a = 16, b = 932, c = 100;
  4. //定义一个指针数组
  5. int *arr[3] = {&a, &b, &c};//也可以不指定长度,直接写作 int *arr[]
  6. //parr 是指向数组 arr 的指针,确切地说是指向 arr 第 0 个元素的指针,
  7. //它的定义形式应该理解为int *(*parr),括号中的*表示 parr 是一个指针,括号外面的int *表示 parr 指向的数据的类型。
  8. //arr 第 0 个元素的类型为 int *,所以在定义 parr 时要加两个 *。
  9. int **parr = arr;
  10. printf("%d, %d, %d\n", *arr[0], *arr[1], *arr[2]);//16, 932, 100
  11. printf("%d, %d, %d\n", **(parr+0), **(parr+1), **(parr+2));//16, 932, 100
  12. return 0;
  13. }

 (2)对多个字符串进行处理:

  1. #include <stdio.h>
  2. int main(){
  3. char *str[3] = {
  4. "c.biancheng.net",
  5. "C语言中文网",
  6. "C Language"
  7. };
  8. printf("%s\n%s\n%s\n", str[0], str[1], str[2]);
  9. /*
  10. 运行结果:
  11. c.biancheng.net
  12. C语言中文网
  13. C Language
  14. */
  15. return 0;
  16. }

解释:str数组存储了两个指针,第一个指针指向了字符串"c.biancheng.net",第二个指针指向了字符串"C语言中文网",第三个指针指向了字符串"C Language"。需要注意的是,字符数组 str 中存放的是字符串的首地址,不是字符串本身,字符串本身位于其他的内存区域,和字符数组是分开的。

.

2.数组指针的使用

(1)对于一维数组:

  1. int main(void)
  2. {
  3.     char a[5]={'A','K','C','G','L'};    
  4.     char (*p)[5]=&a;//&a代表的是整个数组的首地址
  5.     //char (*p)[5]=a;这样是错误的,因为a代表第一个元素的首地址
  6.     printf("%c %c %c",**p,*(*p+1),*(*p+3));//输出:A K G
  7.     return 0;
  8. }

说明:a代表的是第一个元素的地址,即:&a[0],而&a代表的是整个数组的地址a+1代表的是下一个元素的地址,即&a[1],而&a+1代表的是向后移动5个字节的地址。这里为什么用的二级指针呢?因为p=&a,*p即为第一个元素的地址,再**p即输出了第一个元素。同理,*(*p+1),*(*p+3)输出第二个元素,第四个元素。


(2)对于二维数组:

二维数组用行指针定义

p++操作会使p指向下一行的首地址,这是因为p是行指针,指向的是一行。我们可以用sizeof(*p)测试p指向的内容的大小:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };
  5. int(*p)[4];//p指向数组 a 的开头,也即第 0 行;p+1前进一行,指向第 1 行。
  6. int i,j;
  7. p=a;
  8. for(i=0; i<3; i++)
  9. {
  10. for(j=0; j<4; j++)
  11. printf("%2d ",*(*(p+i)+j));//*(*(p+i)+j)表示第 i 行第 j 个元素的值。
  12. printf("\n");
  13. }
  14. /*
  15. 0 1 2 3
  16. 4 5 6 7
  17. 8 9 10 11
  18. */
  19. return 0;
  20. }

 

 

ref:

https://blog.csdn.net/weixin_41923658/article/details/88066916

https://blog.csdn.net/men_wen/article/details/52694069

https://blog.csdn.net/xia__mu/article/details/99879877

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

闽ICP备14008679号