据我对C/C++中数据类型的了解,在声明变量时,我们需要声明它的数据类型,这告诉编译器相应地在内存中保留字节数。
但就指针而言,我们知道它们的大小是恒定的(例如“Turbo Compiler”中的 2 个字节),无论其指向的变量的数据类型如何,因为指针存储的是内存地址作为无符号整数。
我的问题是,如果指针总是以字节为单位的常量大小,那么在声明它们时需要提及数据类型吗?我对指针的理解有误吗?
时需要数据类型,以便它知道应该读取多少数据。例如,取消引用 char
指针应从其指向的地址读取下一个字节,而
int
指针应读取 2 个字节。
?
考虑以下示例:
{
char *k; //poniter of type char
short j=256;
k=&j; // Obviously You have to ignore the warnings
printf("%d",*k)
}
现在因为 k 是
char
类型,所以它只会读取一个字节。现在
256
的二进制值为 0000000100000000
但因为 k 是 char
类型,所以它只会读取第一个字节,因此输出将为 0。 注意 {
short *ptr;
short k=0;
ptr=&k;
k++;
ptr++;// pointer arithmetic
}
陈述
k++
和
ptr++
是同一件事吗?不,k++
表示 k=k+1
,ptr++
表示 ptr=ptr+2
。因为编译器“知道”这是一个指针并且它指向一个short,所以它向 ptr 添加 2 而不是 1,因此该指针“指向”下一个整数。
有关更多信息,请参阅假设你有:
int* someint;
float* somefloat;
*someint
引用内存大小
sizeof(int)
,而*somefloat
引用内存大小sizeof(float)
,这是不同的。int a;
int b = 42;
void * d = &b;
a = *d;
a 的值应该是多少?
现在这个:
int a;
float b = 42.0;
void * d = &b;
a = *d;
您对a 有什么期望?
实际上类型指定了应该如何解释指向的区域。您应该在第一个示例中指定
int *
,在第二个示例中指定
float *
,而不是 void *
。 x86_64
系统上,指针大小可能为 64 位。
之所以需要指针的数据类型,是因为编译器必须知道内存单元的大小,其中包括指针指向的内容。没有类型也无法确保类型安全。此外,当从指针访问结构时,您必须对每个指针进行类型转换。
您还可以使用
void
指针并手动完成所有操作。但你为什么要这样呢?