我有两个指针,
char *str1;
int *str2;
如果我看两个指针的大小,我们假设
str1=4 bytes
str2=4 bytes
str1 ++将增加1个字节,但如果str2 ++增加4个字节。
这背后的概念是什么?
答案 0 :(得分:16)
简单,在提供的场景中:
++ 运算符将指针增加指向类型的大小。
答案 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个字节。