指针和数组学习点滴小结

很多初学者弄不清指针和数组到底有什么样的关系。我现在就告诉你:他们之间没有

任何关系!只是他们经常穿着相似的衣服来逗你玩罢了。

指针就是指针,指针变量在32 位系统下,永远占4 个byte,其值为某一个内存的地址。

指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到。

数组就是数组,其大小与元素的类型和个数有关。定义数组时必须指定其元素的类型

和个数。数组可以存任何类型的数据,但不能存函数。

--------------------------------------------------------------------

下面我们就详细讨论讨论它们之间似是而非的一些特点。例如,函数内部有如下定义:

A),char *p = “abcdef”;

B),char a[] = “123456”;

1,以指针的形式访问和以下标的形式访问指针

例子A)定义了一个指针变量p,p 本身在栈上占4 个byte,p 里存储的是一块内存的首

地址。这块内存在静态区,其空间大小为7 个byte,这块内存也没有名字。对这块内存的访

问完全是匿名的访问。比如现在需要读取字符‘e’,我们有两种方式:

1),以指针的形式:*(p+4)。先取出p 里存储的地址值,假设为0x0000FF00,然后加

上4 个字符的偏移量,得到新的地址0x0000FF04。然后取出0x0000FF04 地址上的值。

2),以下标的形式:p[4]。编译器总是把以下标的形式的操作解析为以指针的形式的操

作。p[4]这个操作会被解析成:先取出p 里存储的地址值,然后加上中括号中4 个元素的偏

移量,计算出新的地址,然后从新的地址中取出值。也就是说以下标的形式访问在本质上

与以指针的形式访问没有区别,只是写法上不同罢了。

2,以指针的形式访问和以下标的形式访问数组

例子B)定义了一个数组a,a 拥有7 个char 类型的元素,其空间大小为7。数组a 本身

在栈上面。对a 的元素的访问必须先根据数组的名字a 找到数组首元素的首地址,然后根据

偏移量找到相应的值。这是一种典型的“具名+匿名”访问。比如现在需要读取字符‘5’,

我们有两种方式:

1),以指针的形式:*(a+4)。a 这时候代表的是数组首元素的首地址,假设为0x0000FF00,

然后加上4 个字符的偏移量,得到新的地址0x0000FF04。然后取出0x0000FF04 地址上的

值。

2),以下标的形式:a[4]。编译器总是把以下标的形式的操作解析为以指针的形式的操

作。a[4]这个操作会被解析成:a 作为数组首元素的首地址,然后加上中括号中4 个元素的

偏移量,计算出新的地址,然后从新的地址中取出值。

由上面的分析,我们可以看到,指针和数组根本就是两个完全不一样的东西。只是它们

都可以“以指针形式”或“以下标形式”进行访问。一个是完全的匿名访问,一个是典型

的具名+匿名访问。一定要注意的是这个“以XXX 的形式的访问”这种表达方式。

另外一个需要强调的是:上面所说的偏移量4 代表的是4 个元素,而不是4 个byte。只

不过这里刚好是char 类型数据1 个字符的大小就为1 个byte。记住这个偏移量的单位是元

素的个数而不是byte 数,在计算新地址时千万别弄错了。

时间: 2024-11-08 23:47:18

指针和数组学习点滴小结的相关文章

<深入理解C指针>学习笔记和总结 第四章 指针和数组

数组是一个什么玩意: 数组和指针我的理解,有相同之处也有不同之处.因有相同之处,因此一些资料上说,数组和指针本质是相同的.因有不同之处,因此也有一些资料上说,数组和指针是不一样的. 相同之处: 数组名字和指针名字都代表了一个地址. 如:int num[10];num是数组名.函数开辟了一个存储十个整数类型的空间,而num是他们的首地址. int *p; p=(int *)malloc(10*sizeof(int));类似的,p也指向了首地址. 不同之处是,num[10]中的空间位置是在栈中,而

C语言学习笔记--指针和数组的关系

1.数组的本质 (1)数组是一段连续的内存空间 (2)数组的空间大小:sizeof(array_type)*array_size; (3)数组名可看做指向数组第一个元素的常量指针 (4)数组声明时编译器自动分配一片连续的内存空间 ,而指针声明时只分配了用于容纳地址值的 4 字节空间 2.指针的运算 (1)指针是一种特殊的变量,与整数的运算规则为: p + n == (unsigned int)p + n * sizeof(*p); 当指针 p 指向一个同类型的数组的元素时,p+1 指向当前元素的

C语言学习笔记(六) 指针和数组

使用C语言就必然会使用到指针和数组.看下面的代码: int main(int argc, char** argv){     int a[4] = {1,3,5,7};     int *p = a;     int i;     for (i=0; i<4;i++){         printf("i=%d, p[i]=%d, *(p+i)=%d, a[i]=%d, *(a+i)=%d\n",                 i, p[i], *(p+i), a[i], *(

C++学习---指针与数组

1.数组 由具体详相同数据类型的数据元素按照一定顺序排列而成的集合,由字符数组.常量数组.实数数组和指针数组等. 1.1一维数组 //一维数组的定义 类型 数组名[常量表达式]: float arry[10]; //其中常量表达式为数组大小,不能含有变量 //一维数组的存储 数组名为数组首元素地址,后续元素按照下标顺序连续存储 int a[6]; //说明6个int型数据按照顺序依次排列 //一维数组的初始化 int a[5] = {1,2,3,4,5}; int a[5] = {1,2,3}/

《C专家编程》学习记录——指针和数组相同的地方

一.在普通的表达式中 先看一段简单的代码 char a[8]; a[3]=9; 3[a]=2; printf("a[3] = %d\r\n", a[3]); printf("3[a] = %d\r\n", 3[a]); 结果是: a[3] = 2 3[a] = 2 原因:表达式中的数组名被编译器当做一个指向该数组第一个元素的指针(ANSI C标准),即在表达式中,指针和数组是可以互换的,因为他们在编译器里的最终形式都是指针,并且都可以进行取下标操作.就像加法一样,取

【C++深入浅出】智能指针之auto_ptr学习

起:  C++98标准加入auto_ptr,即智能指针,C++11加入shared_ptr和weak_ptr两种智能指针,先从auto_ptr的定义学习一下auto_ptr的用法. template<class _Ty> class auto_ptr { // wrap an object pointer to ensure destruction public: //定义_Myt类型,作用域局限于类中,便于书写和理解 typedef auto_ptr<_Ty> _Myt; typ

转:浅谈C/C++中的指针和数组(一)

转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242138.html 浅谈C/C++中的指针和数组(一) 指针是C/C++的精华,而指针和数组又是一对欢喜冤家,很多时候我们并不能很好的区分指针和数组,对于刚毕业的计算机系的本科生很少有人能够熟练掌握指针以及数组的用法和区别.造成这种原因可能跟现在大学教学以及现在市面上流行的很多C或者C++教程有关,这些教程虽然通俗易懂,但是在很多关键性的地方却避而不谈或者根本阐述不清楚,甚至很

函数指针与指针函数的使用与小结

/* ============================================================================ Name : TestFunction.c Author : lf Time : 2015年2月23日16:06:17 Copyright : Your copyright notice Description : 函数指针与指针函数的使用与小结 在C语言中: 函数名其实就是一个函数的起始地址. 同理:数组名其实就是数组首元素的地址. 函

后缀数组学习笔记【详解|图】

后缀数组学习笔记[详解] 老天,一个后缀数组不知道看了多少天,最后终于还是看懂了啊! 最关键的就是一会儿下标表示排名,一会用数值表示排名绕死人了. 我不知道手跑了多少次才明白过来.其实我也建议初学者手跑几遍,但是一定要注意数组的意义,否则就是无用功. 数组含义: s[ ]:输入的字符串,预处理的时候会在末尾加上一个0 sa[ ]:它的下标就是后缀排名 x[ ] = t[ ]:用来保存第一关键字排名,注意!它的数值是排名.初始时恰好是字符串的ASCII码.字典序嘛! y[ ] = t2[ ]:它的