数组、指针、数组指针、指针数组

一、类型 T 的指针和类型 T 的数组并非同种类型。

    常常听说 char c[] 和 char *c 是一样的。
    然而实际上并非如此。数组定义 char c[10] 请求预留 10 个字符的位置, 并用名称 “c” 表示。也就是说, 有一个称为 “c” 的位置, 可以放入 10 个字符。而指针申明 char *p, 请求一个位置放置一个指针, 用名称 “p” 表示。这个指针几乎可以指向任何位置: 任何字符和任何连续的字符, 或者哪里也不指。

    

#include<iostream>
using namespace std;


int main(){
	char c[10]="licongqi";
	char *p = "licongqi";
	char a;
	a = c[0];
	a = c[3];
	a = p[3];
	cout<<c<<endl<<*p<<endl;
	return 0;
}


    根据 X 是数组还是指针, 类似 X[3] 这样的引用会生成不同的代码。以上面的声明为例, 当编译器看到表达式 c[3] 的时候, 它生成代码从 c 的位置开始跳过 3 个, 然后取出那个字符. 如果它看到 p[3], 它生成代码找到“p” 的位置, 取出其中的指针值, 在指针上加 3 然后取出指向的字符。换言之, c[3]是名为 c 的对象 (的起始位置) 之后 3 个位置的值, 而p[3] 是 p 指向的对象的 3 个位置之后的值. 在上例中, c[3] 和 p[3] , 编译器到达那里的途径不尽相同。本质的区别在于类似 c 的数组和类似 p 的指针一旦在表达式中出现就会按照不同的方法计算, 不论它们是否有下标。

下面是访问c[0]、c[3]和p[3]对应的汇编代码。
8:        a = c[0];
004011AE   mov         cl,byte ptr [ebp-0Ch]
004011B1   mov         byte ptr [ebp-14h],cl
9:        a = c[3];
004011B4   mov         dl,byte ptr [ebp-9]
004011B7   mov         byte ptr [ebp-14h],dl
10:       a = p[3];
004011BA   mov         eax,dword ptr [ebp-10h]
004011BD   mov         cl,byte ptr [eax+3]
004011C0   mov         byte ptr [ebp-14h],cl

    数组和指针的区别是什么?
    数组自动分配空间, 但是不能重分配或改变大小。指针必须明确赋值以指向分配的空间 (可能使用 malloc), 但是可以随意重新赋值 (指向不同的对象), 同时除了表示一个内存块的基址之外, 还有许多其它的用途。由于数组和指针所谓的等价性, 数组和指针经常看起来可以互换, 而事实上指向 malloc 分配的内存块的指针通常被看作一个真正的数组(也可以用[]引用)。但是, 要小心 sizeof。

二、指针数组和数组指针大不相同

指针数组,按字面意思理解,就是一个数组,其中的元素是指针。

例如 int *arr[10];声明了一个数组,数组大小为10,数组中元素的类型为int *,若要操作数组中的元素,需要取下标。

而数组指针,则是一个指针,它指向的是一个数组。

例如int (*p)[10];声明了一个指针,该指针指向一个大小为10,元素类型为int的指针。 在使用下标或增量时, 会跳过整个数组, 通常只在操作数组的数组时有用。

#include<iostream>
using namespace std;

int main(){
	int *arr[10];
	cout<<"size of arr:"<<sizeof(arr)<<endl;
	int (*p)[10];
	cout<<"size of p:"<<sizeof(p)<<endl;
	return 0;
}


从程序的运行结果可以证明上述说明。我们只需要按照数组和指针的用法进行操作就好,使用之前记得初始化。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值