C++系列——指针和数组详细分析
2016-08-16 12:03
302 查看
1. 指针和数组在编译阶段的(本质)区别
指针:
编译器符号表指向的是指针变量的地址值,所以还要先得到指针变量所存放的地址值,然后根据该地址值取引用其所指向的对象内容,也就是间接引用其所值对象的值。
数组:
编译器符号表指向的是数组的首个元素的地址,通过下标直接计算元素偏移量,从而直接得到元素的值。
分析:说明了通过数组下标运算取元素是直接取到的(一次地址引用:根据数组首地址或加上偏移量取到数组元素),而如果通过指针的方式取数组元素,则只能通过间接的方式取到(二次地址引用:取指针所指向的地址内容+根据该地址内容取到数组元素)。
2. 指针和数组作为函数参数的区别
一维数组作为函数形参:
形式:
说明:由于数组的第一维的长度不需要,所以,指针和数组的声明形式是都可行的。
多维数组作为函数形参(如2维)
形式:
说明:
由于除了数组的第一维以外的维度的长度都需要被指明,所以只能采用上述两种形式。
不能采用int *pm[100]的形式,这种形式表示的是一个指针数组(数组中的100个元素都是int *类型)。在下一节中重点介绍指针数组。有没有括号的存在,就是改变了符号运算的顺序。一般来说,下标运算的优先级是高于简介引用的。所以对于有括号的情况,pm表示的是指向整型数组的指针;对于没有括号的情况,pm表示的是指针数组。
3. 指针数组
形式:
说明:指针数组也就是每个数组元素指向的是一个指针,指针指向对象的内容是比较灵活的,所以每个元素的长度是可变的。这种形式的出现也是为了使得对象的内存存放更加紧凑,达到节约存储空间的目的,比如上面举得keyword指针数组的例子。与之对比,如果是用一个二维数组来存储,则会使得每个数组元素的长度都是最长字符串的长度,浪费了空间,尤其是在只有几个字符串的长度较长的情况下。
指针:
编译器符号表指向的是指针变量的地址值,所以还要先得到指针变量所存放的地址值,然后根据该地址值取引用其所指向的对象内容,也就是间接引用其所值对象的值。
数组:
编译器符号表指向的是数组的首个元素的地址,通过下标直接计算元素偏移量,从而直接得到元素的值。
int a[10]; int *ap; ap = a; printf(" addr of a = %p\n addr of &a = %p\n addr of &a[0] = %p\n addr of ap = %p\n addr of &ap = %p\n", a, &a, &a[0], ap, &ap);运行结果:
分析:说明了通过数组下标运算取元素是直接取到的(一次地址引用:根据数组首地址或加上偏移量取到数组元素),而如果通过指针的方式取数组元素,则只能通过间接的方式取到(二次地址引用:取指针所指向的地址内容+根据该地址内容取到数组元素)。
2. 指针和数组作为函数参数的区别
一维数组作为函数形参:
形式:
int foo(int *pd) //ok int foo(int pd[]) //ok
说明:由于数组的第一维的长度不需要,所以,指针和数组的声明形式是都可行的。
多维数组作为函数形参(如2维)
形式:
int foo(int (*pm)[100]) //ok.()是必须的,不能省略,见说明2 int foo(int pm[][100]) //ok
说明:
由于除了数组的第一维以外的维度的长度都需要被指明,所以只能采用上述两种形式。
不能采用int *pm[100]的形式,这种形式表示的是一个指针数组(数组中的100个元素都是int *类型)。在下一节中重点介绍指针数组。有没有括号的存在,就是改变了符号运算的顺序。一般来说,下标运算的优先级是高于简介引用的。所以对于有括号的情况,pm表示的是指向整型数组的指针;对于没有括号的情况,pm表示的是指针数组。
3. 指针数组
形式:
int *p[100];一个指针数组的常用方式:
char const keyword[] = { "do", "for", "if", "register", "return", "switch", "while", } #define N_KEYWORD (sizeof(keyword) / sizeof(keyword[0]))
说明:指针数组也就是每个数组元素指向的是一个指针,指针指向对象的内容是比较灵活的,所以每个元素的长度是可变的。这种形式的出现也是为了使得对象的内存存放更加紧凑,达到节约存储空间的目的,比如上面举得keyword指针数组的例子。与之对比,如果是用一个二维数组来存储,则会使得每个数组元素的长度都是最长字符串的长度,浪费了空间,尤其是在只有几个字符串的长度较长的情况下。
相关文章推荐
- C++数组--详细分析
- C++ primer 读书笔记系列——(3)C++中的数组和指针
- [C++] 从编译器角度分析数组名与指针的区别
- c/c++字符指针与字符数组变量汇编层面的分析
- C++基础学习系列第一部分——再议数组与指针
- C++语言中数组指针和指针数组彻底分析(系列一)
- 等级考试二级C++考点分析之数组、指针与引用
- C++中一维数组与指针的关系详细总结
- 详细介绍C/C++数组名与指针区别
- C++ 二级指针、函数指针与数组复合类型的问题分析
- C++语言中数组指针和指针数组彻底分析(系列一)
- 详细介绍C/C++数组名与指针区别
- 探讨C++中数组名与指针的用法比较分析
- 详细介绍C/C++数组名与指针区别
- 详细介绍C/C++数组名与指针区别
- C++数组--详细分析
- 详细介绍C/C++数组名与指针区别
- 详细介绍C/C++数组名与指针区别
- C++语言中数组指针和指针数组彻底分析(系列一) 选择自 zosatapo 的 Blog
- C++语言中数组指针和指针数组彻底分析(系列一)