据我所知,在C/C++中,当声明一个变量时,我们需要声明它的数据类型,这告诉编译器相应地保留内存中的字节数。但是在指针的情况下,我们知道它们的大小是恒定的(例如,在“Turbo Bytes”中为2字节),与它所指向的变量的数据类型无关 *,因为指针存储的是一个无符号整数的内存地址。我的问题是,如果指针 * 总是 * 一个以字节为单位的常量大小,那么在声明它们的时候还有什么必要提到数据类型呢?我对指针的理解是错误的吗?
ekqde3dh1#
当解引用指针时需要数据类型,这样它就知道应该读取多少数据。例如,解引用char指针应该从它所指向的地址读取下一个字节,而int指针应该读取2个字节。
char
int
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。
256
0000000100000000
注意:如果我们分配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教程的第二章。
k++
ptr++
k=k+1
ptr=ptr+2
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);
字符串您将看到指针运算强烈依赖于指向类型的大小。
bttbmeg04#
问题不在于指针的大小,而在于指针的解引用。(无论是在C还是C++中)假设你有:
int* someint; float* somefloat;
字符串*someint引用的存储器大小为sizeof(int),而*somefloat引用的存储器大小为sizeof(float),两者不同。
*someint
sizeof(int)
*somefloat
sizeof(float)
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 *。
int *
float *
void *
n1bvdmb66#
指针的大小取决于你使用的系统。在x86_64系统中,指针的大小可能是64位。指针需要数据类型的原因是因为编译器必须知道内存单元的大小,其中包括指针所指向的内存单元的大小。此外,类型安全无法保证w/o类型。此外,当从指针访问结构时,必须对每个指针进行类型转换。你也可以用void指针来手工完成所有的操作,但是为什么要这样做呢?
x86_64
void
bxpogfeg7#
数据类型仅仅是为了进行类型检查而需要的。
58wvjzkj8#
这是c++中使用的强类型的概念。指针的大小可能相同,但指向的类型的大小可能不同。然而,您始终可以将一种类型的指针转换为另一种类型的指针。
8条答案
按热度按时间ekqde3dh1#
当解引用指针时需要数据类型,这样它就知道应该读取多少数据。例如,解引用
char
指针应该从它所指向的地址读取下一个字节,而int
指针应该读取2个字节。9bfwbjaz2#
在两种情况下需要指针的数据类型:
1.取消引用指针
1.指针运算
如何在解引用指针中使用它?
请考虑以下示例:
字符串
现在因为k的类型是
char
,所以它只会读取一个字节。现在256
的二进制值是0000000100000000
,但是因为k的类型是char
,所以它只会读取第一个字节,因此输出将是0。注意:如果我们分配j=127,那么输出将是127,因为127将由第一个字节保存。
现在我们来看一下指针运算:
请考虑以下示例:
型
语句
k++
和ptr++
是同一个东西吗?不,k++
意味着k=k+1
,ptr++
意味着ptr=ptr+2
。因为编译器“知道”这是一个指针,它指向一个短,它增加2到ptr而不是1,所以指针“指向”下一个整数。更多信息请参考this教程的第二章。
bttbmeg03#
首先是指针本身的大小和表示,aren't always the same for different types。这只是在许多实现中发生的事情。
第二,当使用指针时,你不需要关心指针本身的大小,你需要被指向类型的大小。
例如,试试这个:
字符串
您将看到指针运算强烈依赖于指向类型的大小。
bttbmeg04#
问题不在于指针的大小,而在于指针的解引用。(无论是在C还是C++中)
假设你有:
字符串
*someint
引用的存储器大小为sizeof(int)
,而*somefloat
引用的存储器大小为sizeof(float)
,两者不同。e1xvtsh35#
假设这段代码编译无误(如你所愿):
字符串
a的值应该是多少?
现在这个:
型
你还指望什么?
实际上,类型指定了如何解释指向的区域。您应该在第一个示例中指定
int *
,在第二个示例中指定float *
,而不是void *
。n1bvdmb66#
指针的大小取决于你使用的系统。在
x86_64
系统中,指针的大小可能是64位。指针需要数据类型的原因是因为编译器必须知道内存单元的大小,其中包括指针所指向的内存单元的大小。此外,类型安全无法保证w/o类型。此外,当从指针访问结构时,必须对每个指针进行类型转换。
你也可以用
void
指针来手工完成所有的操作,但是为什么要这样做呢?bxpogfeg7#
数据类型仅仅是为了进行类型检查而需要的。
58wvjzkj8#
这是c++中使用的强类型的概念。指针的大小可能相同,但指向的类型的大小可能不同。然而,您始终可以将一种类型的指针转换为另一种类型的指针。