据我所知数据类型,在声明变量时,我们需要声明其数据类型,告诉编译器相应地保留内存中的字节数。
但是对于指针,我们知道它们的大小总是 2个字节(在Turbo Compiler中)总是与变量的数据类型无关它指向。
我的问题是,如果指针始终采用 2个字节,那么在声明它们时需要提及数据类型吗?或者我对指针的理解是错误的?
答案 0 :(得分:36)
取消引用指针时需要数据类型,以便它知道应该读取多少数据。例如,取消引用char指针应该从它指向的地址读取下一个字节,而int指针应该读取2个字节。
答案 1 :(得分:9)
在两种情况下需要指针的数据类型:
如何在取消引用指针中使用它? 请考虑以下示例:
{
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
。因为编译器"知道"这是一个指针,它指向一个短,它将2加到ptr而不是1,所以指针"指向"下一个整数。
有关更多信息,请参阅this教程的第二章。
答案 2 :(得分:5)
首先是指针本身aren't always the same for different types的大小和表示。这只是许多实现中发生的事情。
其次,当使用指针时,你不关心指针本身的大小。您需要指向类型的大小。
例如,试试这个:
int var[5];
char *c = (char *)var;
int *x = var;
printf("%p\n%p\n", p + 1, x + 1);
你会看到指针算法在很大程度上取决于指向类型的大小。
答案 3 :(得分:5)
问题不在于指针大小,而是指针解除引用。 (用C或C ++编写)
说你有:
int* someint;
float* somefloat;
*someint
引用的内存大小为sizeof(int)
,而*somefloat
引用的内存大小为sizeof(float)
,这些大小不同。
答案 4 :(得分:2)
仅需要数据类型进行类型检查。
答案 5 :(得分:1)
指针所需的大小取决于您使用的系统。在x86_64
系统上,指针大小可能是64位。
你需要指针的数据类型的原因是因为编译器必须知道指针所指向的内存单元的大小。此类型也无法确保类型安全。此外,在从指针访问结构时,您必须对每个指针进行类型转换。
您也可以使用void
指针并手动完成所有操作。但你为什么要这么做呢?
答案 6 :(得分:1)
假设此代码编译时没有错误(如您所愿):
int a;
int b = 42;
void * d = &b;
a = *d;
a的价值应该是什么?
现在有了这个:
int a;
float b = 42.0;
void * d = &b;
a = *d;
您对此有何看法?
实际上,类型指定了如何解释指向区域。您应该在第一个示例中指定int *
,在第二个示例中指定float *
,而不是void *
。
答案 7 :(得分:0)
这是c ++中使用的强类型的概念。指针的大小可以相同,但指向类型的大小可以不同。但是,总是可以将一种类型的指针强制转换为另一种类型的指针。