数组和指针的区别
文章目录
指针可以随时指向任意类型的内存块,而数组可以在静态存储区被创建。例如,全局数组 可以在栈上被创建。从原理与定义上看,虽然指针与数组表示的是不同的概念,但指针却可以方便地访问数组或者模拟数组,两者存在着一种貌似等价的关系,但也存在着诸多不同之处,
主要表现在以下两个方面:
1) 修改内容不同。
例如,char a[] = “hello”,可以通过取下标的方式对其元素值进行修改。例如,a[0] = ‘X’是正确的,而对于char *p = ‘*world”,此时p指向常量字符串,所以p[0] = ‘X’是不允许的,编译会报错。
程序示例如下:
上例中,str3和str4两个字符数组都存储在栈空间上,但两者地址值不相等。而str5和str6并非字符数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于常量区,str5和str6是指它们指向的地址的首地址,而它们自己仅是指向该区首地址的指针,所以相等(&str5和&str6是指指针自己的地址,所以两者地址是不相等的)。
2) 所占字节数不同。
例如,char *p = “world”,p为指针,则sizeof(p)得到的是一个指针变量的字节数,而不是P所指的内存容量。C/C++语言没有办法知道指针所指的内存容量,除非在申请内存时标记出来。
char a[] = “hello world”;
char *p = a;
在32位机器上,sizeof(a)=12字节,而sizeof(p)=4字节.
但需要注意的是,当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。
|
|
此时 sizeof(a)=sizeof(int)=4,而不是 sizeof(int)* 100=400。
文章作者 Forz
上次更新 2017-09-04