当前位置: > 华清远见教育科技集团 > 嵌入式学习 > 讲师博文 > char a[]和char *a的比较
char a[]和char *a的比较
时间:2016-12-13作者:华清远见

指针和数组存在着一些本质的区别。当然,在某种情况下,比如数组作为函数的参数进行传递时,由于该数组自动退化为同类型的指针,所以在函数内部,作为函数参数传递进来的指针与数组确实具有一定的一致性,但这只是一种比较特殊的情况而已,在本质上,两者是有区别的。请看以下的例子:

char a[] = "1234567";
        char *p = "1234567";

上述两个变量的内存布局分别如下:

数组a需要在内存中占用8个字节的空间,这段内存区通过名字a来标志。指针p则需要4个字节的空间来存放地址,这4个字节用名字p来标志。其中存放的地址几乎可以指向任何地方,也可以哪里都不指,即空指针。目前这个p指向某地连续的8个字节,即字符串"1234567"。

另外,例如:对于a[2]和p[2],二者都返回字符‘i’,但是编译器产生的执行代码却不一样。对于a[2],执行代码是从a的位置开始,向后移动2两个字节,然后取出其中的字符。对于p[2],执行代码是从p的位置取出一个地址,在其上加2,然后取出对应内存中的字符。

p指针变量本身在栈上,指向的内容在静态存储区;

a只是个数组名,本身不占运行时程序的空间,只是在源程序中用来标记一个字符数组(即其首地址),而数组也是存储在栈上的。

char s1[] = "a";
        char *s2 = "b";
        a是在运行时刻赋值的;
        而b是在编译时就确定的;
        但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
        比如:
 &nnbsp;      int main()
        {
        char a = 1;
        char c[] = "1234567890";
        char *p ="1234567890";
        a = c[1];
        a = p[1];
        return 0;
        }

对应的汇编代码
        10: a = c[1];
        00401067 8A 4D F1 movcl,byteptr [ebp-0Fh]
        0040106A 88 4D FC mov byte ptr [ebp-4],cl
        11: a = p[1];
        0040106D 8B 55 EC movedx,dwordptr [ebp-14h]
        0040106D 8B 55 EC movedx,dwordptr [ebp-14h]
        0040106D 8B 55 EC movedx,dwordptr [ebp-14h]

第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。

发表评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)