void main() {
char var = 10;
char *ptr = &var;
printf("Pointer address before increment:%p\n", ptr);
printf("sizeof(ptr):%d\n", sizeof(ptr));
ptr++;
printf("Pointer address after increment:%p\n", ptr);
printf("sizeof(ptr):%d\n", sizeof(ptr));
}
输出量:
Pointer address before increment:0x7fffb997144f
sizeof(ptr):8
Pointer address after increment:0x7fffb9971450
sizeof(ptr):8
为什么char
指针只增加一个字节?它的尺寸是8,对吗?当声明ptr
时,编译器会分配8个字节给它。当我们将其递增1
时,它会根据数据类型递增。为什么?这是怎么回事?
4条答案
按热度按时间im9ewurl1#
对于输出
size_t
类型值的初学者,需要使用转换说明符zu
而不是d
增量指针指向它所指向的对象之后的内存。也就是说,
T *
类型的指针的值递增值sizeof( T )
。例如,考虑访问数组元素。
表达式
a[i]
的计算方式类似于*( a + i )
。因此指针的值增加i * sizeof( T )
。这就是所谓的指针算术,
对于
char
类型的对象的大小,根据C标准,sizeof( char )
总是等于1
。还考虑以下演示程序。
其输出
如果指针
p
增加了值sizeof( char * )
,则无法使用指针输出数组。e0bqpujr2#
对于指针算术,重要的不是指针的大小,而是它指向的类型的大小:
T a[10]; T *p = a;
定义了一个指向T
类型的对象数组的指针p
。p
包含a
的第一个元素的内存地址。sizeof(T)
字节,因此将指针p
增加1将使内存地址增加sizeof(*p)
。以下是修改后的版本:
输出(64位):
输出(32位):
vxf3dgd43#
什么是指针?
简单地说,指针是一种特殊类型的变量,用于保存内存地址,编译器分配的位宽或字节大小可能会因平台而异。例如,如果您使用
sizeof
操作符获取8位目标的指针大小,则您将获得2个字节,也就是说,指针可以保存最多64 kB的地址值。这是相当大的,足以容纳只有高达64 kB的ROM和高达几个KB的RAM的设备的地址值。由于编译代码的架构是64位架构,因此系统寄存器的宽度为64位,足以容纳非常大的地址值(264,大于1.8 * 1019)。对于8位字节,这些64位地址占用8个字节。
指针是特殊的对象,所以不能像
编译器不允许这样做,因为指针不是常规类型的变量。因此,为了分配一个常量地址值,必须将其转换为
int
指针,如以下示例所示:指针如何递增
根据指针指向的类型的字节大小,指针会递增。
除
char
类型外,某些类型的大小可能会因平台而异。现在我们知道了指针以及它们是如何递增的,让我们在一个例子中看看。下面的示例使用GCC编译,并在64位Linux系统中执行。
示例的输出如下:
总结
正如您在输出中看到的,所有指针都具有相同的大小,即使它们指向不同的类型。此大小可能因平台而异。
然而,指针的值根据它们所指向的类型而递增或递减。同样,某些类型的大小可能会因平台而异。
yzckvree4#
这是因为一个字符占用1个字节,而一个指向字符的指针是一个指针,而不是一个字符或其他东西,这意味着它存储了一个内存地址,所以它占用8个字节。此外,所有类型的指针在您的机器上都是8字节。