字符指针和整数指针(++)

我有两个指针,

char *str1; int *str2; 

如果我看一下两个指针的大小,我们假设

 str1=4 bytes str2=4 bytes 

str1 ++将增加1个字节,但如果str2 ++它将增加4个字节。

这背后的概念是什么?

简单,在提供的场景中:

  • char长度为1个字节
  • int(在您的平台中)长度为4个字节

++运算符将指针增加指向类型的大小。

在对指针进行算术运算时,它始终是指向的对象,而不是字节。

因此,当您添加一个指针时,其目标对象是例如四个字节的指针将使其实际数值增加四。

这比使用所有指针算法以字节为单位更有意义。

char是1个字节, int是(通常)4个字节。 递增指针时,会增加指向的数据的大小。 因此,当你递增一个char* ,你会增加1个字节,但是当你增加一个int* ,你会增加4个字节。

指针实际上保存内存位置的地址,即4字节整数。 str1指向一个保存1byte的位置,因此如果增加str1的地址,它将跳转到1byte数据的下一个地址。 但在其他情况下,str2指向4字节数据,因此如果增加该地址,它必须跳过该数据以获得下一个4字节数据,因此它增加4。

这是1字节数据序列存储在memmory中的方式:

 ADDRESS: FF334400 FF334401 FF334402 FF334403 DATA (1BYTE): 1 2 3 4 

因此,如果str1想要指向数字2,它必须保持其地址,即FF334401。 如果增加str1,它必须跳过2s地址并转到3,为此,它必须加1。

在其他情况下:

 ADDRESS: FF334400 FF334401 FF334402 FF334403 FF334404 ... FF334407 DATA (4BYTE): 0 0 0 1 0 2 

现在,如果str2指向数字1是整数,并且它实际上是4字节数据,则它指向该数据的开头,即地址FF334400。 当你增加它时,它必须跳过1s数据的所有4个字节以获得2s数据,因此它增加4并且其地址变为FF334404,这是数字2的4字节数据的第一个字节。

提示: p[i]*(p + i)简写。

因为此行为比替代方法更有用,并且允许您不关心特定数据类型的大小。

考虑一个数组和一个指向该数组的整数指针:

 int p[10]; int *q = p; 

然后*(q + 1)与p [1]相同,即内存中的下一个int 。 如果它只指向前一个字节,那将远没那么有用。

指针增量总是通过它所代表的类型的大小增加它指向的地址。 因此,对于char指针,它递增1并且整数乘以4.但是,指针变量本身将需要4个字节来保存地址。

您可以想一想数组索引的工作原理。 包含整数数组a [0]将指向第一个元素,而[1]将指向第二个元素。 在这种情况下,如果增量为1,则应增加4个字节以访问下一个整数。 在字符的情况下,它必须是1.相同的概念适用于所有指针arithemtic。

指针是一种抽象,允许您引用内存中的数据,以便原始内存作为primefaces单元进行访问,以确保它适当地解释所选类型。

指针本身由本机机器字大小表示。 在您的示例中,您有两个指向不同类型的指针,但它们仍然是指向内存中地址的指针,因此这就是它们大小相同的原因。 如其他答案所述,要获得指针引用的数据类型的大小,必须在sizeof操作中取消引用它,例如sizeof(* p)。

++运算符允许您获取一个指针,该指针引用相应类型的内存中的下一个地址。 如果它只是为所有类型增加了一个字节的地址,那么最终可能会在内存中指向数据表示中间的地址

例如,对于两个无符号的4字节整数,分别表示十进制值1和4,278,190,080,从内存中的地址0x00开始(注意这里的地址仅用于说明而不是真实系统的代表,因为操作系统会根据自己的目的保留它们)

 address 0x00 0x01 0x02 0x03 | 0x04 0x05 0x06 0x07 data value (4 byte integer) 0x00 0x00 0x00 0x01 | 0xFF 0x00 0x00 0x00 

如果指向整数的指针有一个对地址0x00的引用而operator ++只是将指针地址递增1个字节,那么你将有一个指向地址0x01的指针,如果你随后以整数forms访问该地址(加上后续的3个字节)将得到一个整数,由数据字节0x00 0x00 0x01加上地址0x04的值表示,在这种情况下,值为0xFF。 这将导致一个十进制值为511的整数,它不代表存储在内存中的2个整数。

要正确访问内存中的下一个整数,operator ++必须将指针的字节地址增加4个字节。

简单。 这取决于编译器。

如果在向指针添加1时int有4个字节的大小,它会将其大小添加到它,也就是说,如果int是2个字节,那么它将把2的大小添加到指针中。 例如,在Turbo C ++中

 int *str = NULL; str + 1; //It will add 2 as Turbo C++ has int size 2 bytes 

在Visual C ++中 ,str + 1; //它将添加4,因为Visual C ++的int大小为4个字节。

char也是如此。

这是根据指针算法。 在这里……

如你所说,为所有指针分配的内存是相同的。 但是当你使用带有指针变量的递增运算符时,则意味着指针应该指向(递增)指向内存中的下一个位置。

因此,如果您使用的是字符指针,那么如果您增加,则希望指向下一个字节宽度为1个字节的字符。 类似地,如果你想增加一个整数指针,那就好像要求它指向下一个四字节宽的整数。

我认为这足以澄清你的问题:)