我有两个指针,
char *str1;
int *str2;
如果我查看两个指针的大小,假设
str1=4 bytes
str2=4 bytes
str1++会增加1个字节,但是如果str2++,它将增加4个字节。
这背后的概念是什么?
我有两个指针,
char *str1;
int *str2;
如果我查看两个指针的大小,假设
str1=4 bytes
str2=4 bytes
str1++会增加1个字节,但是如果str2++,它将增加4个字节。
这背后的概念是什么?
在提供的情况下,简单来说:
++ 运算符会将指针按指向类型的大小增加。
在指针进行算术运算时,它总是基于指向的对象而不是字节。
因此,一个指向四个字节的目标对象的指针,在加一时其实际数值会增加四个。
这比所有指针算术都以字节为单位要更可用,更有意义。
char
是 1 字节,int
是 (通常) 4 字节。当您增加指针时,您按所指向的数据大小增加。因此,当您增加 char*
时,您增加 1 字节,但当您增加 int*
时,您增加 4 字节。
ADDRESS: FF334400 FF334401 FF334402 FF334403
DATA (1BYTE): 1 2 3 4
因此,如果str1想指向数字2,它必须持有其地址,即FF334401。如果你增加str1,它必须跳过2的地址并到达3,为了做到这一点,它必须增加1。
在其他情况下:
ADDRESS: FF334400 FF334401 FF334402 FF334403 FF334404 ... FF334407
DATA (4BYTE): 0 0 0 1 0 2
p[i]
是 *(p + i)
的简写形式。因为这种行为比另一种替代方案更有用,而且可以让你不必关心特定数据类型的大小。
考虑一个数组和指向该数组的整数指针:
int p[10];
int *q = p;
那么 *(q+1) 就等同于 p[1],也就是内存中下一个 int
。如果它只指向一个字节,那将会远不如此有用。
指针增量总是将其表示类型的大小所占字节数加到它所指向的地址上。因此,对于char指针,它会增加1个字节;对于整数,则增加4个字节。但是,指针变量本身需要4个字节来保存地址。
您可以想一下数组索引的工作原理。对于整数数组a [0]将指向第一个元素,a [1]将指向第二个元素。在这种情况下,对于增量1,应增加4个字节以访问下一个整数。对于字符,它必须为1。同样的概念适用于所有指针算术操作。
很简单,这取决于编译器。
如果int类型的大小为4个字节,当您将1添加到其指针时,它将将其大小添加到其中,也就是说,如果int类型为2个字节,则会将2即其大小添加到指针中。例如,在Turbo C ++中。
int *str = NULL;
str + 1; //It will add 2 as Turbo C++ has int size 2 bytes
这是根据指针算术运算。它是这样的...
正如你所说,所有指针分配的内存是一样的。但当你使用增量运算符与指针变量一起使用时,那就意味着指针应该指向(增加)内存中的下一个位置。
因此,如果你使用字符指针,那么如果你增加了它,你就要指向下一个长度为一个字节宽度的字符。同样,如果你想增加一个整数指针,那么就像要求它指向下一个长度为四个字节宽度的整数。
我想这足以澄清你的问题 :)
address 0x00 0x01 0x02 0x03 | 0x04 0x05 0x06 0x07
data value (4 byte integer) 0x00 0x00 0x00 0x01 | 0xFF 0x00 0x00 0x00
如果一个指向整数的指针引用了地址0x00,而操作符++刚好将指针地址增加了1个字节,那么你就会得到一个指向地址0x01的指针。如果你接着访问该地址(以及随后的3个字节)作为整数,你将得到一个由数据字节0x00 0x00 0x01和地址0x04的值组成的整数,而在这种情况下,地址0x04的值是0xFF。这将导致一个十进制值为511的整数,它既不代表内存中存储的任何一个整数。
要正确访问内存中的下一个整数,操作符++必须将指针的字节地址增加4个字节。