据我所知的数据类型,在声明变量时,我们需要声明其数据类型,它告诉编译器相应地保留内存中的字节数.
但是在指针的情况下,我们知道它们的大小总是2个字节(在Turbo编译器中)总是与它所指向的变量的数据类型无关.
我的问题是,如果指针总是占用2个字节,那么在声明它们时需要提一下数据类型吗?或者我对指针的理解是错误的?
gli*_*ste 40
取消引用指针时需要数据类型,以便它知道应该读取多少数据.例如,取消引用char指针应该从它指向的地址读取下一个字节,而int指针应该读取2个字节.
A.s*_*lar 10
在两种情况下需要指针的数据类型:
如何在解除引用指针时使用它?
请考虑以下示例:
{
char *k; //poniter of type char
short j=256;
k=&j; // Obviously You have to ignore the warnings
printf("%d",*k)
}
Run Code Online (Sandbox Code Playgroud)
现在因为k是类型char
所以它只读取一个字节.现在二进制值256
是0000000100000000
因为k是类型char
所以它只读取第一个字节,因此输出将为0.
注意:如果我们分配j = 127,那么输出将是127,因为127将由第一个字节保持.
现在来指针算术:
考虑以下示例:
{
short *ptr;
short k=0;
ptr=&k;
k++;
ptr++;// pointer arithmetic
}
Run Code Online (Sandbox Code Playgroud)
是报表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);
Run Code Online (Sandbox Code Playgroud)
你会看到指针运算强烈依赖于指向类型的大小.
问题不在于指针大小,而是指针解除引用.(在C或C++中)
说你有:
int* someint;
float* somefloat;
Run Code Online (Sandbox Code Playgroud)
*someint
引用内存大小sizeof(int)
,而*somefloat
引用的内存大小sizeof(float)
不同.