为什么指针声明中需要数据类型?
据我所知, 数据类型在声明变量时,我们需要声明其数据类型,告诉编译器相应地保留内存中的字节数。
但是在指针的情况下,我们知道它们的大小总是2个字节(在Turbo编译器中)总是与它所指向的变量的数据类型无关。
我的问题是,如果指针总是占用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。
注意 :如果我们指定j = 127,则输出将为127,因为127将由第一个字节保持。
现在来指针算术 :
请考虑以下示例:
{ short *ptr; short k=0; ptr=&k; k++; ptr++;// pointer arithmetic }
语句k++
和ptr++
是一回事吗? 不, k++
表示k=k+1
, ptr++
表示ptr=ptr+2
。 因为编译器“知道”这是一个指针而且它指向一个short,它将2加到ptr而不是1,所以指针“指向”下一个整数。
有关更多信息,请参阅本教程的第二章。
首先, 对于不同类型 ,指针本身的大小和表示并不总是相同 。 这只是许多实现中发生的事情。
其次,当使用指针时,你不关心指针本身的大小。 您需要指向类型的大小 。
例如,试试这个:
int var[5]; char *c = (char *)var; int *x = var; printf("%p\n%p\n", p + 1, x + 1);
你会看到指针运算强烈依赖于指向类型的大小。
问题不在于指针大小,而是指针解除引用。 (在C或C ++中)
说你有:
int* someint; float* somefloat;
*someint
引用sizeof(int)
的内存大小,而*somefloat
引用sizeof(float)
的内存大小,它们是不同的。
仅用于类型检查需要数据类型。
指针所需的大小取决于您使用的系统。 在x86_64
系统上,指针大小可能是64位。
你需要指针的数据类型的原因是因为编译器必须知道指针所指向的内存单元的大小。 此类型也无法确保类型安全。 此外,在从指针访问结构时,您必须对每个指针进行类型转换。
您也可以使用void
指针并手动完成所有操作。 但是你为什么要这样呢?
假设此代码编译时没有错误(如您所愿):
int a; int b = 42; void * d = &b; a = *d;
应该是什么价值?
现在有了这个:
int a; float b = 42.0; void * d = &b; a = *d;
你期待什么?
实际上,类型指定了如何解释指向区域。 您应该在第一个示例中指定int *
,在第二个示例中指定float *
,而不是void *
。
它是c ++中使用的强类型的概念。 指针的大小可以相同,但指向类型的大小可能不同。 但是,您始终可以将一种类型的指针强制转换为另一种类型的指针。