假设我有一些名为:
的指针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 ..难怪我得到了访问违规,我试图读取我不应该阅读的某个地方.. :)
答案 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:访问冲突 - 取决于。如果您没有超出为这些指针分配的内存,则不会发生访问冲突。复制操作将逐字节复制所有内容,您将获得与预期相同的结果(虽然它可能没有多大意义)。
如果您要超出分配的内存范围,那么可能会获得访问冲突,但您可能只是跨越到为另一个变量分配的内存中。几乎不可能知道程序执行的时间是什么,所以这样做会导致非常不可预测的结果。
指针有三个主要优点:
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偏移量。