栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

指针的用法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

指针的用法

指针是一块内存地址的首地址,这其中包含两个概念:
1.指针是内存地址;
2.指针还包括内存大小,void指针占用一个指针大小。
比如:int *a指的是内存地址a,大小为int的内存块。

不同类型的指针之间的联系和区别

1.普通指针和数组指针

#include
int main()
{
	char a[4];
	char (*pa)[4],*pb;
	pa=&a;
	pb=&a[0];
	printf("pa占用内存大小是:%dn",sizeof(*pa));
	printf("pb占用内存大小是:%dn",sizeof(*pb));
	printf("pa是:%pn",pa);
	printf("pa+1是:%pn",pa+1);
	printf("pb是:%pn",pb);
	printf("pb+1是:%pn",pb+1);
	return 0;
}
pa占用内存大小是:4
pb占用内存大小是:1
pa是:0x7ff7b425df18
pa+1是:0x7ff7b425df1c
pb是:0x7ff7b425df18
pb+1是:0x7ff7b425df19

在上面的案例中,&a和&a[0]都表示char型数组a的首地址,但是他们的类型并不相同。
&a[0],a先和[0]结合,所以&a[0]是一个元素的大小,在这里是1字节;
&a,本质上是char *(&a)[4],是数组指针,此时&a表示的是char *[4]类型指针,是4字节;
根据开头的原理,指针是内存块,指针的值是内存块的首地址,指针的类型是内存大小。
因此,指针的递增(+1)指的是类型大小的递增。
指针数组和数组指针的概念参考:c语言进阶笔记

2.不同指针间的类型转换
不同类型指针的强制转换会造成内存变化,但首地址不会变。

int main()
{
	int a=12345678;
	int *pa=&a;
	char *pb=(char *)&a;
	printf("pa:%pn",pa);
	printf("pa_value:%dn",*pa);
	printf("pb:%pn",pb);
	printf("pb_value:%dn",*pb);

	return 0;
}
pa:0x7ff7b0ebaf18
pa_value:12345678
pb:0x7ff7b0ebaf18
pb_value:78

同时可以发现,这个内存模型是大端对齐。

指针与字符串

通过指针定义的字符串形式如下:

char *str="hello";

此时str具有只读属性,不能被修改:

#include
int main()
{
	char *a="hello";
	*(a+1)='B';
	printf("%sn",a);
	return 0;
}

此时编译会成功,但执行会崩溃,因为通过指针定义的字符串在内存中具有只读属性。
如果指针指向的字符串不具有只读属性,那么就可以对其进行修改:

#include
int main()
{
	char a[20]="abc";
	char *p;
	p=a;
	*(p+1)='2';
	printf("%sn",p);


	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1034341.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号