指针数组
来源:互联网 发布:吉林十一选五遗漏数据 编辑:程序博客网 时间:2024/05/23 12:16
int main()
{
// 字符串本身代表一个char*类型的指针!!
char *arr[5] = {"hello1",
"hello2",
"hello3",
"hello4",
"hello5"};
char **p = arr;
int i;
for (i = 0; i < 5; i++)
{
printf ("%s\n", arr[i]);
}
return 0;
}
二维数组与指针:
为了更好的理解指针和二维数组的关系,我们先来定义一个指向 a 的指针变量 p:
int (*p)[4] = a;
括号中的*表明 p 是一个指针,它指向一个数组,数组的类型为int [4],这正是a 所包含的每个一维数组的类型。
[ ]的优先级高于*,( )是必须要加的,如果赤裸裸地写作int *p[4],那么应该理解为int *(p[4]),p就成了一个指针数组,而不是二维数组指针,这在 C语言指针数组 中已经讲到。
对指针进行加法(减法)运算时,它前进(后退)的步长与它指向的数据类型有关,p 指向的数据类型是int [4],那么p+1就前进4×4 = 16 个字节,p-1就后退16 个字节,这正好是数组a 所包含的每个一维数组的长度。也就是说,p+1会使得指针指向二维数组的下一行,p-1会使得指针指向数组的上一行。
数组名 a 在表达式中也会被转换为和p 等价的指针!
按照上面的定义:
1) p指向数组 a的开头,也即第 0行;p+1前进一行,指向第1 行。
2) *(p+1)表示取地址上的数据,也就是整个第 1行数据。注意是一行数据,是多个数据,不是第 1行中的第 0个元素,下面的运行结果有力地证明了这一点:
#include <stdio.h>
int main(){
int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };
int (*p)[4] = a;
printf("%d\n", sizeof(*(p+1)));
return 0;
}
运行结果:
16
指针数组和二维数组指针的区别:
指针数组和二维数组指针在定义时非常相似,只是括号的位置不同:
int *(p1[5]); //指针数组,可以去掉括号直接写作 int *p1[5];
int (*p2)[5]; //二维数组指针,不能去掉括号
指针数组和二维数组指针有着本质上的区别:指针数组是一个数组,只是每个元素保存的都是指针,以上面的 p1为例,在32位环境下它占用4×5 = 20 个字节的内存。二维数组指针是一个指针,它指向一个二维数组,以上面的p2 为例,它占用4 个字节的内存。
- 指针数组、数组指针
- 指针数组/数组指针
- 指针数组/数组指针
- 数组指针 指针数组
- 指针数组,数组指针
- 数组,指针,数组指针
- 数组,指针,数组指针
- 指针数组&数组指针
- 指针数组&数组指针
- 数组指针 指针数组
- 指针数组/数组指针
- 数组指针&指针数组
- 数组指针 指针数组
- 数组指针 指针数组
- 指针数组 数组指针
- 指针数组,数组指针
- 指针数组 数组指针
- 指针数组&数组指针
- 关于springAOP,面向切面编程
- UVa232-Crossword Answers
- Qt QTableWidget小结
- 指针方式逆序数组
- 二叉树的计算的一些算法
- 指针数组
- MySQL创建和删除索引的语法
- Win10下安装Ubuntu16.04双系统
- 递归实现十进制数转十六进制数
- pandas 第2课
- I/O流
- RecyclerView的item点击事件监听器
- codevs 2439 降雨量 (RMQ+离散化+令人窒息的分类讨论)
- 中国基准、基本气象站列表2012版