C++探幽:指针与数组的对比

数组要么被建立在静态存储区(如全局数组),要么被建立在栈上(局部数组)。数组名对应着一块内存,而不是指向一块内存,其地址与容量保持不变,只有数组的内容可以改变。
指针可以随时指向任意类型的内存块,其特征是可变。因此经常使用指针操作动态内存块,比数组灵活,却也更危险

修改内容

char *p="hello";//其实在VS2017里边,该指针不能这样定义,而是const char *p="hello"才不会报错。
cout<<p<<endl;

所以 ∗ p *p p指向常量字符串,而对于以下代码:

char p[]="hello";
p[0]="H";
cout<<p<<endl;

虽然p可以理解为一个指向数组首个元素的地址的指针,但是本质上对应着一块内存,而不是指向一块内存,内容是可以改变的。

内容复制与比较

数组

不能对数组名直接比较,若想把数组a的内容复制给b,不能使用语句b=a,而应该使用标准库函数strcpy进行复制。比较a和b内容是否相同,不可以直接使用if(b==a),因为这样比较的是地址,而内容的比较需要使用标准的库函数strcmp()

char p[] = "hello";
char a[10];
strcpy_s(a, p);//a=p;编译器会报错
cout << a << endl;
if(strcmp(a,p)==0)cout<<"true"<<endl;
指针

指针直接相等代表着两个指针指向同一个地址,如果指针a需要复制指针b的内容,需要先为指针a申请一块内存,然后使用strcpy,strcmp等函数进行copy和比较

int len=strlen(b);
char *a=(char*)malloc(sizeof(char)*(len+1));
strcpy(a,b);
if(strcmp(a,b)==0)cout<<"true"<<endl;

计算内存容量

sizeof()函数可以计算出数组的容量,但是如果sizeof(指针),得到的只是一个指针的字节数

int p[] = {10,1,2,3};
	int a[10];
	int *pp = p;
	cout << sizeof(p) << endl;
	cout << sizeof(a) << endl;
	cout << sizeof(pp) << endl;

输出分别是16,40,8
当数组作为函数的参数进行传递时,该数组自动退化成同类型的指针

void Func(char a[100])
{
 cout<< sizeof(a) << endl; // 8字节而不是100字节(32位操作系统是4字节)
}
int main()
{
	char b[100];
	Func(b);
}//输出是8,(32位操作系统输出是4)

参考这篇写的超级全面细致(强烈推荐)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值