C语言 为什么在指针声明中需要数据类型?

unhi4e5o  于 12个月前  发布在  其他
关注(0)|答案(8)|浏览(132)

据我所知,在C/C++中,当声明一个变量时,我们需要声明它的数据类型,这告诉编译器相应地保留内存中的字节数。
但是在指针的情况下,我们知道它们的大小是恒定的(例如,在“Turbo Bytes”中为2字节),与它所指向的变量的数据类型无关 *,因为指针存储的是一个无符号整数的内存地址。
我的问题是,如果指针 * 总是 * 一个以字节为单位的常量大小,那么在声明它们的时候还有什么必要提到数据类型呢?我对指针的理解是错误的吗?

ekqde3dh

ekqde3dh1#

解引用指针时需要数据类型,这样它就知道应该读取多少数据。例如,解引用char指针应该从它所指向的地址读取下一个字节,而int指针应该读取2个字节。

9bfwbjaz

9bfwbjaz2#

在两种情况下需要指针的数据类型:
1.取消引用指针
1.指针运算
如何在解引用指针中使用它?
请考虑以下示例:

{
        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+1ptr++意味着ptr=ptr+2。因为编译器“知道”这是一个指针,它指向一个短,它增加2到ptr而不是1,所以指针“指向”下一个整数。
更多信息请参考this教程的第二章。

bttbmeg0

bttbmeg03#

首先是指针本身的大小和表示,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);

字符串
您将看到指针运算强烈依赖于指向类型的大小。

bttbmeg0

bttbmeg04#

问题不在于指针的大小,而在于指针的解引用。(无论是在C还是C++中)
假设你有:

int* someint;
float* somefloat;

字符串
*someint引用的存储器大小为sizeof(int),而*somefloat引用的存储器大小为sizeof(float),两者不同。

e1xvtsh3

e1xvtsh35#

假设这段代码编译无误(如你所愿):

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 *

n1bvdmb6

n1bvdmb66#

指针的大小取决于你使用的系统。在x86_64系统中,指针的大小可能是64位。
指针需要数据类型的原因是因为编译器必须知道内存单元的大小,其中包括指针所指向的内存单元的大小。此外,类型安全无法保证w/o类型。此外,当从指针访问结构时,必须对每个指针进行类型转换。
你也可以用void指针来手工完成所有的操作,但是为什么要这样做呢?

bxpogfeg

bxpogfeg7#

数据类型仅仅是为了进行类型检查而需要的。

58wvjzkj

58wvjzkj8#

这是c++中使用的强类型的概念。指针的大小可能相同,但指向的类型的大小可能不同。然而,您始终可以将一种类型的指针转换为另一种类型的指针。

相关问题