作者ptt0720 (湿湿)
看板C_and_CPP
标题[问题] c语言双重pointer问题
时间Tue Jun 27 11:04:21 2017
开发平台(Platform): (Ex: Win10, Linux, ...)
macOS
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
GCC
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
我想请问一下丢&A 然後用A**去接是什麽意思?
另外我测试了**A *A A 去接
然後印出 *A **A的值都会一样
让我更困惑了
喂入的资料(Input):
预期的正确结果(Expected Output):
错误结果(Wrong Output):
console:
10
20
程式码(Code):(请善用置底文网页, 记得排版)
#include <stdio.h>
#include <stdlib.h>
void fun(int **A){
printf("%d\n",*A);
printf("%d\n",**A);
}
int mian(){
int a = 10;
int *A = &a;
fun(&A);
}
补充说明(Supplement):
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.114.123.157
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1498532665.A.05B.html
1F:推 TWkobe: 假设a的地址是0x100,值为10 , pointerA的地址为0x200, 值 06/27 11:08
2F:→ TWkobe: 为0x100 06/27 11:09
3F:→ TWkobe: 你把&A喂进去就是把0x200丢进去 06/27 11:10
4F:→ ptt0720: 那用什麽东西接有差吗 用**A *A A 06/27 11:26
5F:推 TWkobe: 你可以想像**A要跑两次所以丢0x200进去後, 他会先依照0x20 06/27 11:27
6F:→ TWkobe: 0找出值0x100, 再依0x100寻找得到值10, 所以丢&A後**A为10 06/27 11:28
7F:→ TWkobe: 而丢&A使用*A就只有跑一次, 所以印出0x100 06/27 11:29
8F:→ ptt0720: 感谢 06/27 11:31
9F:→ freeunixer: 你是看什麽书写的范例?这个 code 形参、实参用得不好 06/27 11:35
10F:推 TWkobe: 若你只是print出A , 是显示你喂进来的pointer所储存的内容 06/27 11:35
11F:→ TWkobe: 所以依照你的范例结果为0x200 06/27 11:35
12F:→ freeunixer: 你最好不要将 main 跟 fun 的变数写一样,才好看出差别 06/27 11:36
13F:→ freeunixer: 你的问题是没搞清楚为什麽 main 传 &A 进 fun(), 06/27 11:37
14F:→ freeunixer: 但 fun 却是收 (**A)...事实上,两个 A 是不同的. 06/27 11:37
15F:→ freeunixer: 将 fun 的 A 全改成 B,会比较好区分,也比较容易搞清楚 06/27 11:39
16F:→ alex70266: 其实记住C只有call by value就是了 06/29 23:44
17F:→ alex70266: 阿阿怎麽会推文到这来XDDDDD 搞笑orz 06/29 23:48
18F:→ zakk0610: 当你的func要改pointer的值(*p的p)时会传**p,传*p无法改 08/02 07:29
19F:→ zakk0610: p的值 08/02 07:29
20F:→ zakk0610: 精确来讲可以改值但只改到local variable 08/02 07:30