C ++中的指针类型有什么意义?

时间:2008-12-19 09:07:23

标签: c++ pointers memcpy

假设我有一些名为:

的指针
char * pChar;
int * pInt;

我知道它们都只是保存指向某个其他位置的内存地址,并且这些类型声明了特定指针指向的内存位置有多大。例如,一个char可能是系统上一个字节的大小,而一个int可能是4个字节..所以当我这样做时:

pChar++; // I am actually incrementing the address pointed to by pChar by 1 byte;
pInt++; // I am actually incrementing the address pointed to by pInt by 4 bytes;

但如果我这样做会怎么样:

pChar+2; // increment the address pointed to by pChar by 2 bytes?
pInt+2; // increment the address pointed to by pInt by 2 bytes? what happens to the other two bytes?

谢谢..请在此澄清任何澄清..指针类型是否仅适用于++操作?

编辑:所以avp恰当地回答了我的问题,但我有一个跟进问题,当我这样做时会发生什么:

memcpy(pChar,pInt,2);

它会复制2个字节吗?还是4个字节?我是否会违反访问权限?

编辑:根据Ryan Fox的说法,答案是2个字节,因为它们被强制转换为(void *)。谢谢! CLOSED!

编辑:为了让未来的搜索者找到这个......我发现了另一条信息..

memcpy(pChar+5,pInt+5,2);

不会将pInt + 5bytelocations指向的内存块的2个字节复制到pChar + 5bytelocations ..会发生的是2个字节从pInt(4 * 5)bytelocations复制到pChar + 5bytelocations ..难怪我得到了访问违规,我试图读取我不应该阅读的某个地方.. :)

5 个答案:

答案 0 :(得分:7)

“++”只是X = X + 1;

的另一个名称

对于指针,如果增加1或N,则无关紧要。 无论如何,使用sizeof(type)* N.在1的情况下,它将只是sizeof(类型)。

所以,当你增加2(你的第二种情况)时:
for char是2 * sizeof(char)= 2 * 1 = 2字节,
for int将是2 * sizeof(int)= 2 * 4 = 8个字节。

答案 1 :(得分:5)

啊,现在我明白了。你应该问 - “有类型的指针是什么意思?”

实际上有两点:

  • 指针算术;
  • 取消引用(获取存储在指针所指向的地址中的值)。

如果不知道指针的类型,两者都是不可能的。

已添加:阅读memcpy的文档。最后一个参数是字节数,因为memcpy不知道指针的类型是什么。它的两个参数都是无效指针。

添加2:访问冲突 - 取决于。如果您没有超出为这些指针分配的内存,则不会发生访问冲突。复制操作将逐字节复制所有内容,您将获得与预期相同的结果(虽然它可能没有多大意义)。

如果您要超出分配的内存范围,那么可能会获得访问冲突,但您可能只是跨越到为另一个变量分配的内存中。几乎不可能知道程序执行的时间是什么,所以这样做会导致非常不可预测的结果。


指针有三个主要优点:

  1. 您可以通过“引用”将参数传递给函数。这曾经是C中的一个问题,它没有像C ++这样的实际引用,但在许多情况下它仍然非常有用,比如当你必须与外部库合作时。另请注意,通过引用传递不仅在您希望函数修改您传递的变量时有用。它也非常适合将大型数据结构作为参数传递。
  2. 用于构建各种漂亮的动态数据结构,如树,链表等。没有指针,这是不可能的。
  3. 能够根据需要将数组重新分配给更大/更小的数组。
  4. P.S。我明白问题是为什么指针是好的,只使用算术作为一个例子,对吗?

答案 2 :(得分:3)

指针算法不能正确地工作。你的第一个例子是正确的,第二个例子不是那么多。

pChar+2; // increment the address pointed to by pChar by 2 bytes
pInt+2; // increment the address pointed to by pInt by 8 bytes

答案 3 :(得分:1)

对于这部分:

  

的memcpy(PCHAR + 5,+品脱5,2);

首先,评估“+”,然后进行类型转换。

所以以字节为单位:

pChar + 5这里“5”是5个字节,
pInt + 5这里“5”是5个整数,所以5 * 4 = 20个字节 然后一切都被转换为void *并复制了两个字节。

如果不是“5”而使用计数器,就像这里:

for (int i = 0; i<100; i++)
    memcpy(pChar+i, pInt+i, 2);

然后对于pChar,您将使用下一个复制命令覆盖一个复制的字节(第二个)。对于pInt,你将每步跳4个字节(虽然这对于一些整数是可以的。)

答案 4 :(得分:0)

我会说 C ++ 中指针类型的要点是考虑vtable偏移量。