赞
踩
顾名思义:指针类型的数组,首先是一个数组,数组元素存储的是指针。(中国的修饰词往往都在前面,而西方修饰词往往是放在后面)
语法如下:
目标类型 数组名称[元素个数]
如:int * p[3] 数组p有3个元素,每个元素存储的都是指针类型
- int a[] = {1, 3, 5}; //定义数组a
-
- int* p[3]; //定义指针数组p,有三个元素,每个元素存储都是指针类型
-
- p[0] = a; //或 &a[0]
-
- p[1] = &a[1]; //或 a+1
-
- 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
- #include <stdio.h>
- /*
- 时间:2022-04-28 15:31
- 作者:sgbl888
- 功能:指针数组
- 知识点:
- 1、指针类型的数组,首先是数组,数组元素存储的都是指针
- 2、数组名在表达式中会转换为数组首元素的首地址
- 3、对数组名使用sizeof关键字或对数组名取地址 &数组名 不会转换首元素的首地址
- */
- int main(){
- int a[] = {1, 3, 5};
- int *p[3]; //[]符高于其它运算符,p先与[3]组合。因此p[3]是一个有3个元素的int*(整型指针)的数组。简单点是就数组里面存储的都是指针类型
- p[0] = a; //或 a
- p[1] = a+1; //或 a+1
- p[2] = a+2; //或 a+2
-
- printf("p[3] sizeof: %zd Byte\n", sizeof p); //p三个元素都是int*指针,在64位系统占用8字节,三个元素共占用24个字节
-
- printf("%p %p %p\n", &a[0], &a[1], &a[2]); //打印三个元素的地址
- printf("%p %p %p\n", p[0], p[1], p[2]); //都是指向数组a的各个元素
- printf("%p %p %p %p %p\n", *p, *(p+0), p[0], a, &a[0]); //结果都是数组第一个元素的首地址
- printf("%d %d %d %d %d\n", **p, *(*(p+0)), *p[0], *a, *(&a[0])); //结果都是数值1
-
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。