c语音指针问题:Pnumn、*Pnum、num分别指啥?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语音指针问题:Pnumn、*Pnum、num分别指啥?相关的知识,希望对你有一定的参考价值。
加入num=5,这是说num的值是5.
那pnum=&num是指针指向num的地址
*pnum是num的值,
单纯从字面上看那这三个到底是说你们关系??如果pfuck是不是也能代替pnum,还是如果想要和num发生什么关系必须命名为p+num
内存的地址都是用十六进制表示的吗?
指针本身有个地址对吧,那指向了另一个变量是获取另一个变量的地址,那这个时候指针的值是不是同时也是这个被指向变量的值?
十分感谢!
十六进制么,只是一种进制,都是方便人类而设计出来的,计算机用的都是二进制。
不是。这里准确讲应该叫做指针变量,它自己也是个变量,他的值是num在内存中的地址,所以同通过它的值可以访问num,因为知道了num在内存中的位置。另,一般大家讲指针的时候都是指 指针变量。追问
哦 原来这样。
最后你说:所以同通过它的值可以访问num,因为知道了num在内存中的位置。
是不是通过这个指针, 访问的是num的地址,而访问num的地址,而num地址中存的值不就同样被访问了,所以可以不可以说这个指针指向num地址,值是num的值?
额,这个。。说的我有点糊涂。因为这个指针变量的值是num在内存里的地址,也就是我们平常所说这个指针指向num变量,而num变量的值就是1234神马的。你那么说应该是对的。
楼上的第三条你不要在意,表述不准确。严格讲是不对的。1=2么
int *pnum = # /*定义一个指针变量pnum,其本身地址是0x00000002,值为:0x00000001*/
*pnum = 10; /*也就是对这个指针变量地址解引用,也就是取0x00000001地址的值进行赋值*/
int **pfuck = pnum; /*另外一个指针变量pfuck,其本身地址是0x00000003,值为0x00000002*/
**pfuck = 20; /*两次解引用*/
指针只是指向某一个地址,而这个地址是存放这个指针类型的一个值
解释的自己有点糊涂了追问
谢谢你,我也看迷了。我看了不下5遍,前面可以看懂,到第三个就迷了。
在c ++函数中,指针与索引数组
【中文标题】在c ++函数中,指针与索引数组【英文标题】:Within c++ function, pointer vs indexed array 【发布时间】:2012-07-11 17:30:29 【问题描述】:这个问题类似于earlier 提出的问题,但我认为不考虑内存分页。所以,我在这里再次提出类似的问题:
// version 1
int nums[100];
int* pNum = nums;
for(int i=0;i<100;i++,pNum++)
foo(pNum);
// version 2
for(int i=0;i<100;i++)
foo(nums[i]);
哪个版本会更快?之前有人说生成的汇编代码会非常相似,因为两个版本都需要递增内存地址的位置,但是考虑到一个非常大的数组,内存分页性能会显着改变吗?因为其中一个需要长移位,而另一个需要从数组的基内存地址移位?我知道它非常依赖于平台/编译器,但仍想了解人们的常见做法,尤其是处理大型数据类型,如图像处理或科学计算?谢谢。
【问题讨论】:
尝试两者的时间并自己看看。但我警告说,现代编译器非常有能力将一种形式转换为另一种形式。所以可能很难进行基准测试。 你不应该担心这样的小细节。编译器足够聪明,无论您如何编写它都可以优化它。此外,像这样的微优化几乎都是浪费时间。效率低下的原因通常要大得多。 实际上,这是一个面试问题,我已经说过类似@templatetypedef 的内容,但我认为这对芯片组制造商来说真的很重要。 @Mysticial,如果我在关闭编译器优化的情况下尝试两个版本是否有意义? TBH,我之前实际上已经玩过这个特定的优化。而且没有明确的赢家。它们不一样,但都不是总是更快。当您增加多个指针时,它会变得很有趣。第一个版本有更多的增量,但第二个版本有间接寻址和更多的寄存器压力。我已经看到高达 50% 的差异。但如前所述,它非常依赖于硬件和编译器的环境。我认为它是一种难以解决的微优化。 【参考方案1】:我知道它非常依赖于平台/编译器
没错
但仍想了解人们的常见做法,尤其是处理图像处理或科学计算等大型数据类型?谢谢。
这两种做法都很常见,就像使用向量和迭代器一样。您正在担心一些极有可能无关紧要的事情。使用最能表达您在脑海中可视化算法的方式的任何内容,这样更容易正确维护和发展。
【讨论】:
【参考方案2】:普遍的共识是,对于原始类型,没有区别。大多数编译器会为此生成完全相同的代码(大概您的意思是foo(*pNum)
)。
【讨论】:
如果它不生成相同的代码,我想它更有可能在版本 1 上“搞砸”,因为它不是编写代码的典型方式,并且使用指针,编译器偶尔会遇到麻烦。 你考虑缓存未命中/内存分页吗?假设 pNum 当前指向地址 base_address+10*sizeof(int),在这种情况下,CPU 可能会认为从 base_address+10*sizeof(int) 缓存到 30*sizeof(int) 是个好主意。但是对于有索引的数组,没有提示处理数组的哪一部分? 大多数编译器都有输出 asm 代码的选项(例如 gcc 上的 -S)。带有 -O1 的 gcc 完全为这两种情况生成相同的代码。以上是关于c语音指针问题:Pnumn、*Pnum、num分别指啥?的主要内容,如果未能解决你的问题,请参考以下文章