char a[]和char *a的比较,数组名,数组首地址,a,&a,&a[0]
来源:互联网 发布:定时鼠标点击软件源码 编辑:程序博客网 时间:2024/05/16 14:45
指针和数组存在着一些本质的区别。当然,在某种情况下,比如数组作为函数的参数进行传递时,由于该数组自动退化为同类型的指针,所以在函数内部,作为函数参数传递进来的指针与数组确实具有一定的一致性,但这只是一种比较特殊的情况而已,在本质上,两者是有区别的。请看以下的例子:
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是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
比如:
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 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。
include
- char a[]和char *a的比较,数组名,数组首地址,a,&a,&a[0]
- char a[]和char *a的比较,数组名,数组首地址,a,&a,&a[0]
- char a[]和char *a的比较,数组名,数组首地址,a,&a,&a[0]
- 如何理解指针和数组char * a, char ** a, char * a[], char a[][], char * a[][], char ** a[][], char * a [][][]
- 数组名,数组首地址,a,&a,&a[0]
- 数组名,数组首地址,a,&a,&a[0]
- char a[](字符串数组)和char *a(字符串指针)区别
- char a[](字符串数组)和char *a(字符串指针)区别
- char a[](字符串数组)和char *a(字符串指针)区别
- char a[]和char* a
- char a[] 和 char *a
- char a[] 和char *a
- char *a和 char a[]
- char a[]和char *a 的不同
- char* a和 char a[]的区别
- char* a和char a[]的区别
- char* a 和char a[]的区别
- char* a和char a[]的区别
- JavaScript强化教程——AJAX
- What are the advantages of semi-supervised learning over supervised and unsupervised learning?
- java基础篇(七)super关键字
- linux的那些事(1)
- 73. Set Matrix Zeroes
- char a[]和char *a的比较,数组名,数组首地址,a,&a,&a[0]
- mysql 主从配置,实现读写分离
- Gesture 通过手势实现翻书效果
- 设置Intent.FLAG_ACTIVITY_NEW_TASK和Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED对Activity Stack的影响
- JavaScript强化教程 - 六步实现贪食蛇
- Android 使用Socket实现服务器与手机客户端的长连接五:使用队列封装请求
- android消息通知Noticication使用详解
- VIJOS 1516 N连环
- json,jsonObject , jsonArray 详解