指针与数组的区别[转]
时间:2010-07-27 来源:byhoo123
char *p1, *p2; |
这个题目存在的两个问题,第一个问题比较简单,可以认为是粗心大意。但是第二个问题就是相当复杂了,扩展开来,那就是C语言中的精华中的指针和数组的联系与区别问题了。
下面分为两步,首先看一下指针和数组的区别方法,然后提出对上述程序的修改方案。
1 指针和数组的区别
(1)指针和数组的分配
数组是开辟一块连续的内存空间,数组本身的标识符(也就是通常所说的数组名)代表整个数组,可以使用sizeof来获得数组所占据内存空间的大小(注意,不是数组元素的个数,而是数组占据内存空间的大小,这是以字节为单位的)。举例如下:
#include <stdio.h> |
这里又分为两种情况。
第一,如果是全局的和静态的
char *p = “hello”;
这是定义了一个指针,指向rodata section里面的“hello”,可以被编译器放到字符串池。在汇编里面的关键字为.ltorg。意思就是在字符串池里的字符串是可以共享的,这也是编译器优化的一个措施。
char a[] = “hello”;
这是定义了一个数组,分配在可写数据块,不会被放到字符串池。
第二,如果是局部的
char *p = “hello”;
这是定义了一个指针,指向rodata section里面的“hello”,可以被编译器放到字符串池。在汇编里面的关键字为.ltorg。意思就是在字符串池里的字符串是可以共享的,这也是编译器优化的一个措施。另外,在函数中可以返回它的地址,也就是说,指针是局部变量,但是它指向的内容是全局的。
char a[] = “hello”;
这是定义了一个数组,分配在堆栈上,初始化由编译器进行。(短的时候直接用指令填充,长的时候就从全局字符串表拷贝),不会被放到字符串池(同样如前,可能会从字符串池中拷贝过来)。注意不应该返回它的地址。
(3)使用方法
如果是全局指针,用于不需要修改内容,但是可能会修改指针的情况。
如果是全局数组,用于不需要修改地址,但是却需要修改内容的情况。
如果既需要修改指针,又需要修改内容,那么就定义一个数组,再定义一个指针指向它就可以了。
2 我编写的修改方案
[armlinux@lqm pointer]$ cat pointer.c |
// ARRAY_OR_POINTER为0时 |
[armlinux@lqm pointer]$ make |