假设我有一些指针:
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*).谢谢!关闭!
编辑:以便未来的搜索者可以找到这个..我发现的另一条信息..
memcpy(pChar+5,pInt+5,2);
没有将pInt + 5bytelocations指向的内存块的2个字节复制到pChar + 5bytelocations ..会发生的是2个字节从pInt(4*5)bytelocations复制到pChar + 5bytelocations ..难怪我有访问冲突,我试图读取某个我不应该阅读的地方.. :)
"++"只是X = X + 1的另一个名称;
对于指针,如果增加1或N,则无关紧要.无论如何,使用sizeof(type)*N. 在1的情况下,它将只是sizeof(类型).
因此,当您递增2(第二种情况)时:
对于char是2*sizeof(char)= 2*1 = 2个字节,
对于int将是2*sizeof(int)= 2*4 = 8个字节.
啊,现在我明白了.你应该问 - "有类型的指针是什么意思?"
实际上有两点:
指针算术;
解除引用(获取存储在指针所指向的地址中的值).
如果不知道指针的类型,两者都是不可能的.
补充:阅读memcpy的文档.最后一个参数是字节数,因为memcpy不知道指针的类型是什么.它的两个参数都是无效指针.
添加2:访问冲突 - 取决于.如果您没有超出为这些指针分配的内存,则不会出现访问冲突.复制操作将逐字节复制所有内容,您将获得与预期相同的结果(虽然它可能没有多大意义).
如果你要超出你分配的内存范围,那么你可能会遇到访问冲突,但你可能只是跨越到为另一个变量分配的内存中.几乎不可能分辨出程序执行时的位置,因此这样做会导致非常不可预测的结果.
指针有三个主要优点:
您可以通过"引用"将参数传递给函数.这曾经是C中的一个问题,它没有像C++这样的实际引用,但在许多情况下它仍然非常有用,比如当你必须与外部库合作时.另请注意,通过引用传递不仅在您希望函数修改您传递的变量时有用.它也非常适合将大型数据结构作为参数传递.
用于构建各种漂亮的动态数据结构,如树,链表等.没有指针,这是不可能的.
能够根据需要将数组重新分配给更大/更小的数组.
PS我明白问题是为什么指针是好的,仅使用算术作为一个例子,对吧?