当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C++中的指针类型有什么意义?》经验,为你挑选了2个好方法。

假设我有一些指针:

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 ..难怪我有访问冲突,我试图读取某个我不应该阅读的地方.. :)



1> avp..:

"++"只是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个字节.



2> Vilx-..:

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

实际上有两点:

指针算术;

解除引用(获取存储在指针所指向的地址中的值).

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

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

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

如果你要超出你分配的内存范围,那么你可能会遇到访问冲突,但你可能只是跨越到为另一个变量分配的内存中.几乎不可能分辨出程序执行时的位置,因此这样做会导致非常不可预测的结果.


指针有三个主要优点:

    您可以通过"引用"将参数传递给函数.这曾经是C中的一个问题,它没有像C++这样的实际引用,但在许多情况下它仍然非常有用,比如当你必须与外部库合作时.另请注意,通过引用传递不仅在您希望函数修改您传递的变量时有用.它也非常适合将大型数据结构作为参数传递.

    用于构建各种漂亮的动态数据结构,如树,链表等.没有指针,这是不可能的.

    能够根据需要将数组重新分配给更大/更小的数组.

PS我明白问题是为什么指针是好的,仅使用算术作为一个例子,对吧?

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有