转载:http://c.biancheng.net/cpp/html/3246.html

注意:数组指针的区别

如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组。指针数组的定义形式一般为:

dataType *arrayName[length];

[ ]的优先级高于*,该定义形式应该理解为:

dataType *(arrayName[length]);

括号里面说明arrayName是一个数组,包含了length个元素,括号外面说明每个元素的类型为dataType *

除了每个元素的数据类型不同,指针数组和普通数组在其他方面都是一样的,下面是一个简单的例子:

#include <stdio.h>
int main(){
int a = , b = , c = ;
//定义一个指针数组
int *arr[] = {&a, &b, &c};//也可以不指定长度,直接写作 int *parr[]
//定义一个指向指针数组的指针
int **parr = arr;
printf("%d, %d, %d\n", *arr[], *arr[], *arr[]);
printf("%d, %d, %d\n", **(parr+), **(parr+), **(parr+));
return ;
}

运行结果:
16, 932, 100
16, 932, 100

arr 是一个指针数组,它包含了 3 个元素,每个元素都是一个指针,在定义 arr 的同时,我们使用变量 a、b、c 的地址对它进行了初始化,这和普通数组是多么地类似。

parr 是指向数组 arr 的指针,确切地说是指向 arr 第 0 个元素的指针,它的定义形式应该理解为int *(*parr),括号中的*表示 parr 是一个指针,括号外面的int *表示 parr 指向的数据的类型。arr 第 0 个元素的类型为 int *,所以在定义 parr 时要加两个 *。

第一个 printf() 语句中,arr[i] 表示获取第 i 个元素的值,该元素是一个指针,还需要在前面增加一个 * 才能取得它指向的数据,也即 *arr[i] 的形式。

第二个 printf() 语句中,parr+i 表示第 i 个元素的地址,*(parr+i) 表示获取第 i 个元素的值(该元素是一个指针),**(parr+i) 表示获取第 i 个元素指向的数据。

指针数组还可以和字符串数组结合使用,请看下面的例子:

#include <stdio.h>
int main(){
char *str[] = {
"c.biancheng.net",
"C语言中文网",
"C Language"
};
printf("%s\n%s\n%s\n", str[], str[], str[]);
return ;
}

运行结果:
c.biancheng.net
C语言中文网
C Language

需要注意的是,字符数组 str 中存放的是字符串的首地址,不是字符串本身,字符串本身位于其他的内存区域,和字符数组是分开的。

也只有当指针数组中每个元素的类型都是char *时,才能像上面那样给指针数组赋值,其他类型不行。

为了便于理解,可以将上面的字符串数组改成下面的形式,它们都是等价的。


#include <stdio.h>
int main(){
char *str0 = "c.biancheng.net";
char *str1 = "C语言中文网";
char *str2 = "C Language";
char *str[] = {str0, str1, str2};
printf("%s\n%s\n%s\n", str[], str[], str[]);
return ;
}


最新文章

  1. VMware Player安装Debian系统
  2. SQL Server里如何随机记录集
  3. 【C语言】16-预处理指令2-条件编译
  4. 架构设计--逻辑层 vs 物理层
  5. x86_64 Ubuntu 14.04 LST安装gcc4.1.2 转载
  6. IOS Xcode 无法识别IOS device 突然发生的
  7. Excel常用函数
  8. etTimeout与setInterval方法的区别
  9. CXF 调用C#.net的WebService
  10. 基于spark和sparkstreaming的word2vec
  11. 让gdb能打印C++中的容器类型
  12. Windows Server 2008取消登录前的Ctrl+Alt+Delete组合键操作
  13. gjt常用命令---chalee
  14. Hibernate 和 Mybatis 两者相比的优缺点
  15. float 、double 加减乘除出现小数位多出的问题
  16. .NetCore下使用Prometheus实现系统监控和警报 (五)进阶自定义收集指标 之 Counter
  17. SQL EXCEPT INTERSECT
  18. Lua之table
  19. STM32之HAL库、标准外设库、LL库
  20. 表格细边框的两种CSS实现方法

热门文章

  1. start and end call use itelephony and how to pick up a call
  2. MONO MessageBox 类
  3. CentOS7安装virtualbox
  4. 【Guava】PreConditions来校验参数
  5. Getway网关管理ZUUL
  6. 用idea搭建一个简单的SSM的Demo
  7. 实现基于NTP协议的网络校时功能
  8. manjaro 清理系统
  9. WPF Lambda
  10. tomcat+nginx+redis集群搭建并解决session共享问题。