为什么指针声明中需要数据类型?

问题描述 投票:0回答:9

据我对C/C++中数据类型的了解,在声明变量时,我们需要声明它的数据类型,这告诉编译器相应地在内存中保留字节数。

但就指针而言,我们知道它们的大小是恒定的(例如“Turbo Compiler”中的 2 个字节),无论其指向的变量的数据类型如何,因为指针存储的是内存地址作为无符号整数。

我的问题是,如果指针

总是以字节为单位的常量大小,那么在声明它们时需要提及数据类型吗?我对指针的理解有误吗?

c++ c pointers
9个回答
75
投票
取消引用指针

时需要数据类型,以便它知道应该读取多少数据。例如,取消引用 char 指针应从其指向的地址读取下一个字节,而

int
指针应读取 2 个字节。
    


23
投票


取消引用指针
  1. 指针运算
  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,所以它向 ptr 添加 2 而不是 1,因此该指针“指向”下一个整数。

有关更多信息,请参阅
this
教程的第二章。


7
投票
对于不同类型来说并不总是相同的

。这只是在许多实现中发生的事情。 其次,当使用指针时,你不关心指针本身的大小。您需要

尖头类型的尺寸

例如,试试这个:

int var[5]; char *c = (char *)var; int *x = var; printf("%p\n%p\n", p + 1, x + 1);

您会发现指针算术很大程度上取决于指向类型的大小。


5
投票

假设你有:

int* someint; float* somefloat;

*someint

引用内存大小

sizeof(int)
,而
*somefloat
引用内存大小
sizeof(float)
,这是不同的。
    


3
投票

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 *
    


2
投票
x86_64

系统上,指针大小可能为 64 位。


之所以需要指针的数据类型,是因为编译器必须知道内存单元的大小,其中包括指针指向的内容。没有类型也无法确保类型安全。此外,当从指针访问结构时,您必须对每个指针进行类型转换。

您还可以使用

void

指针并手动完成所有操作。但你为什么要这样呢?

    


1
投票


0
投票


0
投票

例如,当您取消引用指针时,指针的类型决定了要读取的内存字节数以及如何解释这些字节。如果您有一个 int* 指向整数的内存位置,则取消引用它(*intPointer)将为您提供该整数的值。

int myInt = 42; int* intPointer = &myInt; // Pointer to an integer cout << *intPointer << endl; // Prints the value of myInt (42)

如果没有类型信息,编译器将不知道如何正确解释指针所指向的内存位置处的数据。

详细了解 ->

关注本书

© www.soinside.com 2019 - 2024. All rights reserved.