指针和数组:
很多人认为指针和数组基本相同,但其实不然,指针和数组的区别在于:
1、指针:是保存数据的地址,如果要访问数据,首先取得指针的内容,把它作为地址,然后从这个地址提取数据,如果指针有个下标[i],就是把指针的内容加上i作为地址,然后从中取出数据;如下例:
char *p= “abcdefgh” c = p[i];
编译器符号表有一个p,地址为4567:
运行步骤1:取出p地址4567中的内容,即5081
运行步骤2:取出i的值,将其和5081相加;
运行步骤3:取出(5081+i)中的内容
2、数组:是保存数据,直接访问数据,a[i]就是简单地以a+i为地址去取得数据;如下例:
char a[9] = “abcdefgh”,c=a[i]; 数组中数组名被编译器当作指向第一个元素的指针;
编译器符号a具有一个地址9980:
运行步骤1:取i的值,将它与9980相加;
运行步骤2:取出地址(9980+i)的内容;
除了上述区别外,还有:
------------------------------------------------------------------------------------------------------------
指针 | 数组
通常用于动态数据结构 | 通常用于存储固定数目且数据类型相同的数据
通常指向匿名数据 | 自身即为数据名
使用 malloc 和 free 函数 | 隐式分配和删除
------------------------------------------------------------------------------------------------------------
指针和数组在以下情况下是相同的:
1、表达式中的数组名被编译器当成指向该数组第一个元素指针;
2、在函数参数的声明中,数组名被编译器当作指向该数组的第一个元素的指针;
在表达式中数组和指针是可以互换的,他们在编译器里的最终形式都为指针 ;