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

时间:2010-04-09 07:17:26

标签: c++ c pointers

我有两个指针,

char *str1;
int *str2;

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

str1=4 bytes
str2=4 bytes

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

这背后的概念是什么?

10 个答案:

答案 0 :(得分:16)

简单,在提供的场景中:

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

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

答案 1 :(得分:9)

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

所以一个指针,其目标对象是例如四个字节,当你添加一个字节时,它会将实际数值增加四。

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

答案 2 :(得分:4)

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

答案 3 :(得分:3)

指针实际保存内存位置的地址,即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的4byte数据的第一个字节。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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

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

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

简单。这取决于编译器。

如果int在其指针上添加1时有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也是如此。

答案 8 :(得分:0)

这是根据指针算法。这就是..

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

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

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

答案 9 :(得分:0)

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

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

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

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

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的指针,如果你随后访问了该地址(加上后续的3个字节),一个整数,你会得到一个整数,由数据字节0x00 0x00 0x01加上地址0x04的值表示,在这种情况下是0xFF的值。这将导致一个十进制值为511的整数,它不代表存储在内存中的2个整数。

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