关于指针的一点思考

本文详细解析了指针的概念及不同类型指针的区别,包括一维和多维数组指针的操作方式,void指针的用途,以及字符串地址的两种保存方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指针是一个变量,所不同的是,它存的是地址。
因为数据类型决定着如何解释这个地址(字节数和操作),因此根据的数据类型的不同,指针又有不同的类型。

某个对象(a)的地址范围为:[&a, &a + size_n),其中size_n是a所占的字节数
比如一个一维数组int a[10],地址范围为[&a, &a + 10*sizeof(int) )

对于不同的数据类型,操作是不同的,
如一维数组指针和二维数组指针: int a[3], b[4][3], *pa = a, (*pb)[3] = b;
对于
pa += 1 和 pb += 1
是不同的。前者会移动sizeof(int)个字节,后者则会移动3*sizeof(int)个字节,这就是数据类型决定操作,所以我想这应该就是设计不同类型的指针的主要原因了。


关于多维数组的地址

众所周知,一维数组的元素地址是连在一起的,二维数组是根据列优先排列的,也就是一行接一行排列。实际上,对于多维数组,下标越靠右,下标变化得越快

一个m维数组a[N1][N2]...[Nm]
则有

a[i1][i2]...[im]=a+sizej=1mijk=j+1mNk

其中size是元素的所占字节数
注意这里的单位是字节,因此不是并不能直接在C语言里使用

例如int a[3][4];
&a[i][j] = a +sizeof(int) * i * 4 + sizeof(int) * j
正确的调用a[i][j]地址的C语法为 (int*)a + i * 4 + j


关于void类型指针
前面说过,数组类型决定如何解释这个地址,void并不是一种真正的类型。因此它不能直接使用,但它可以作为一种中间量,暂时保存地址。真正使用的时候必须转换。

它常常作为通用指针使用。在C标准库里面,有的函数参数正是这种,这样就可以实现通用操作。

如:void *memcpy( void *to, const void *from, size_t count );
这里的count是数据类型的所占的字节数,这样可以实现任意的类型的复制操作


关于字符串的地址:
字符串一般有两种保存方式,
(1) char str[] = {“123456789”};
(2) char *str = “123456789”;
第一种是使用字符串数组保存,文字是存在str数组里的,
第二种则不同,str是一个字符指针,因此它保存的仅仅是这段文字存放的位置的首地址,这段文字是存在常量区的。
另外,还可以先申请一段空间(堆),使用malloc等,然后保存文字,这样也是也可以的,而且更灵活,相对的也更容易出错。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值