C语言中学指针时*和&是相互补充的,为啥啊?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中学指针时*和&是相互补充的,为啥啊?相关的知识,希望对你有一定的参考价值。

搞不懂,求详细解释
就是说&*ptr和*&是等价的 为什么啊

参考技术A 举个例子吧 int i 和 int *p 定义一个变量 i 和 一个指针p
p=&i; 意思就是p 指向 i 因为指针是一段4字节大小的空间,里面存放着指向的目标的地址 &的意思就是取地址 也就是取i的地址存放到p里
在定义一个 int j
j=*p 意思就是 j=i *p的意思是p 解引用的意思就是引用指针指向的内容 这里也就是i
这么说明白么?
参考技术B 再地址运算中,有
*+地址==取地址的对象
&+对象==去对象的地址

这个编译器就是这么定义的,你想问题为什么一定是这两个符号吗?如果是这个我问题,我个人认为就跟英文a表示一个一样,为什么不用b呢?不过我倒是觉得@更合适替换*
参考技术C 1. 在C语言中,所有的类型都是值类型,传参也都是值传递。不要听谭浩强书上说分什么引用类型和值类型,所有的类型都有其值!

2. 指针类型也是一个值,这个值表示一个内存地址,是一个int型数据。

3. * 和 & 都是操作符。记住,他们是操作符,操作符的定义是什么?
* 表示间接引用,& 表示取址。

假设有一个变量:
int num = 4;
获取num在内存中的地址:
&num,结果是一个16进制的int数据

可以使用指针保存这个数据,如下
int *p = #

可以使用这个指针获取该内存地址存储的值
int b = *p;

这样,两个操作符之间的互相转换的关系,明白了么?就相当于乘法和除法的互相转换!

至于他们互相补充,我想应该是值内存中地址的加减法运算!
【例子】获取下一块内存地址的值
*(p+1) <=> *( &num + 1 * sizeof(int) ) 很明显使用指针写的代码少多了,方便多了!注意,此处获得的地址可能是非法的,但是可以此处忽略,不是我们讨论的重点!追问

是我没把问题说清楚 我用的是清华大学出版社的C how to program
课本中对指针讲得很不详细
这样一段程序
int a=1;
int *aPrt=&a;
printf("%p\n%p",&*aPrt,*&aPrt)
书上说输出的两行结果是一样的都是aPrt的值即a的地址 我就看不懂了 假设定义aPrt时它被分配给了3000H这个位置,a被分配给了2000H这个位置 那么*&aPrt=*(&aPrt)=*(3000H)=2000H=aPrt 可是&*aPrt=&(1),1是一个数字&如何对其操作呢?

追答

额。。。
&*aPrt = &(*aPrt) = &(a)而不是&(1)! &(a)和&(1)是两回事。这里不是简单的公式替换,你此处的1是哪来的,就是存储a的那块内存取得的,这个1是有地址的。。。。

对比下:#define a 1 此处的1是常量
此时,你再试试cout<<&a<<endl; 看看值是多少

等我周一直接给你解释上面程序的汇编代码吧~~~感觉自己没有描述到点子上,你还会有疑惑的!

本回答被提问者采纳
参考技术D 因为定义了指针变量*p后,p后就代表所指变量的地址,要把变量的地址赋值给p 就要用到&符号
定义了这许多之后,*p代表的就是地址的内容

为啥会出错啊!???????

参考技术A 第一,内存泄漏
C/C++程序还可能产生另一个指针问题:丢失对已分配内存的引用。当内存是在子程序中被分 配时,通常会出现这种问题,其结果是程序从子程序中返回时不会释放内存。如此一来,对已分配的内存的引用就会丢失,只要操作系统还在运行中,则进程就会一 直使用该内存。这样的结果是,曾占用更多的内存的程序会降低系统性能,直到机器完全停止工作,才会完全清空内存。
第二,C指针错误
用C或C++编写的程序,如Web服务器API模块,有可能导致系统的崩溃,因为只要间接引 用指针(即,访问指向的内存)中出现一个错误,就会导致操作系统终止所有程序。另外,使用了糟糕的C指针的Java模拟量(analog)将访问一个空的 对象引用。Java中的空引用通常不会导致立刻退出JVM,但是前提是程序员能够使用异常处理方法恰当地处理错误。在这方面,Java无需过多的关注,但 使用Java对可靠性进行额外的度量则会对性能产生一些负面影响。
第三,数据库中的临时表不够用
许多数据库的临时表(cursor)数目都是固定的,临时表即保留查询结果的内存区域。在临时表中的数据都被读取后,临时表便会被释放,但大量同时进行的查询可能耗尽数目固定的所有临时表。这时,其他的查询就需要列队等候,直到有临时表被释放时才能再继续运行。
第四,线程死锁
由多线程带来的性能改善是以可靠性为代价的,主要是因为这样有可能产生线程死锁。线程死锁 时,第一个线程等待第二个线程释放资源,而同时第二个线程又在等待第一个线程释放资源。我们来想像这样一种情形:在人行道上两个人迎面相遇,为了给对方让 道,两人同时向一侧迈出一步,双方无法通过,又同时向另一侧迈出一步,这样还是无法通过。双方都以同样的迈步方式堵住了对方的去路。假设这种情况一直持续 下去,这样就不难理解为何会发生死锁现象了。
第五,磁盘已满
导致系统无法正常运行的最可能的原因是磁盘已满。一个好的网络管理员会密切关注磁盘的使用情况,隔一定的时间,就需要将磁盘上的一些负载转存到备份存储介质中(例如磁带)。
日志文件会很快用光所有的磁盘空间。Web服务器的日志文件、SQL*Net的日志文件、 JDBC日志文件,以及应用程序服务器日志文件均与内存泄漏有同等的危害。可以采取措施将日志文件保存在与操作系统不同的文件系统中。日志文件系统空间已 满时Web服务器也会被挂起,但机器自身被挂起的几率已大大减低。
第六,服务器超载
Netscape Web服务器的每个连接都使用一个线程。Netscape Enterprise Web服务器会在线程用完后挂起,而不为已存在的连接提供任何服务。如果有一种负载分布机制可以检测到服务器没有响应,则该服务器上的负载就可以分布到其 它的Web服务器上,这可能会致使这些服务器一个接一个地用光所有的线程。这样一来,整个服务器组都会被挂起。操作系统级别可能还在不断地接收新的连接, 而应用程序(Web服务器)却无法为这些连接提供服务。用户可以在浏览器状态行上看到connected(已连接)的提示消息,但这以后什么也不会发生。
总之,还有许多因素也极有可能导致Web香港服务器租用或香港服务器托管站点无法工作。有许多种原因可能导致Web站点无法正常工作,这使得系统地检查所有问题变得很困难。

以上是关于C语言中学指针时*和&是相互补充的,为啥啊?的主要内容,如果未能解决你的问题,请参考以下文章

C语言,用指针方式定义的字符串为啥不能修改?

为啥说C语言的精髓是指针?

c语言中,为啥不能对字符指针变量指向的字符串再赋值?

C语言free释放内存后为啥指针里的值不变?竟然还可以输出

C语言,宏定义和结构体指针问题,求高手解答啊,谢谢了!!

CString之间为啥不能互相赋值