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
内存的地址都是用十六进制表示的吗?
指针本身有个地址对吧,那指向了另一个变量是获取另一个变量的地址,那这个时候指针的值是不是同时也是这个被指向变量的值?
十分感谢!

参考技术A 从字面上看到的是一个变量和一个指向它的指针,都只是名字而已,一个代号,所以pfuck代替pnum也不是不可,只是直观上传达给你的信息就不一样了,最起码我不知道pfuck是指向num的。

十六进制么,只是一种进制,都是方便人类而设计出来的,计算机用的都是二进制。

不是。这里准确讲应该叫做指针变量,它自己也是个变量,他的值是num在内存中的地址,所以同通过它的值可以访问num,因为知道了num在内存中的位置。另,一般大家讲指针的时候都是指 指针变量。追问

哦 原来这样。
最后你说:所以同通过它的值可以访问num,因为知道了num在内存中的位置。

是不是通过这个指针, 访问的是num的地址,而访问num的地址,而num地址中存的值不就同样被访问了,所以可以不可以说这个指针指向num地址,值是num的值?

追答

额,这个。。说的我有点糊涂。因为这个指针变量的值是num在内存里的地址,也就是我们平常所说这个指针指向num变量,而num变量的值就是1234神马的。你那么说应该是对的。

楼上的第三条你不要在意,表述不准确。严格讲是不对的。1=2么

本回答被提问者采纳
参考技术B int num= 5; /*定义一个变量,变量值为5,设地址为0x00000001*/
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分别指啥?的主要内容,如果未能解决你的问题,请参考以下文章

二重指针实现排序

批处理代码(两日期之间相差的天数)怎么写才能数出来

初学c语言指针问题

C语言同类型指针赋值简单问题

C语言的指针传递,指针的指针的问题,谁能帮我分析分析这个问题?

c语言指针变量问题