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

C++ 字符指针和整数指针(+;+;),c++,c,pointers,C++,C,Pointers,我有两个指针 char *str1; int *str2; 如果我看两个指针的大小,让我们假设 str1=4 bytes str2=4 bytes str1++将增加1个字节,但如果str2++增加4个字节 这背后的概念是什么?提示:p[i]是*(p+i)指针实际持有内存位置的地址,它是4字节整数。str1指向一个容纳1字节数据的位置,因此,如果增加str1的地址,它将跳转到下一个1字节数据的地址。但在另一种情况下,str2指向一个4字节的数据,因此如果增加该地址,它必须跳过该数据才能到达下

我有两个指针

char *str1;
int *str2;
如果我看两个指针的大小,让我们假设

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


这背后的概念是什么?

提示:
p[i]
*(p+i)
指针实际持有内存位置的地址,它是4字节整数。str1指向一个容纳1字节数据的位置,因此,如果增加str1的地址,它将跳转到下一个1字节数据的地址。但在另一种情况下,str2指向一个4字节的数据,因此如果增加该地址,它必须跳过该数据才能到达下一个4字节的数据,因此它将增加4

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

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字节数据的第一个字节。

对指针进行算术运算时,它总是根据指向的对象,而不是字节

因此,目标对象为4字节的指针在添加一个字节时,其实际数值将增加4


这比所有指针算术都是字节更有用,也更有意义。

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

因为这种行为比其他行为更有用,并且允许您不必关心特定数据类型有多大

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

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

那么*(q+1)与p[1]相同,即内存中的下一个
int
。如果它只指向前面的一个字节,那么它的用处就会小得多。

指针增量总是将它指向的地址增加它所表示的类型的大小。所以,对于char指针,它增加1,对于integer,它增加4。但是,指针变量本身需要4个字节来保存地址


您可以深入思考数组索引是如何工作的。对于整数数组,[0]将指向第一个元素,[1]将指向第二个元素。在这种情况下,如果增量为1,则应增加4个字节以访问下一个整数。如果是字符,则必须为1。相同的概念适用于所有指针算术。

简单,在提供的场景中:

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

++运算符按指针类型的大小递增指针。

简单。这取决于编译器

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

中,str+1//Visual C++的int大小为4字节,将增加4。
char也是如此。

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

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

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


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

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

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

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

e、 g.对于两个分别表示十进制值1和4278190080的无符号4字节整数,从内存中的地址0x00开始(请注意,此处的地址仅用于说明,并不代表实际系统,因为操作系统会将其保留用于自己的目的)

如果指向整数的指针引用了地址0x00,并且运算符++刚刚将指针地址增加了1个字节,那么您将拥有指向地址0x01的指针,如果您随后访问该地址(加上随后的3个字节)作为一个整数,您将得到一个整数,该整数由数据字节0x00 0x00 0x01加上地址0x04的值表示,在本例中,地址0x04的值为0xFF。这将导致一个十进制值为511的整数,它不代表存储在内存中的两个整数中的任何一个

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

如果要知道指针的“步长”,请
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