- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在查看 "Pointers in C: when to use the ampersand and the asterisk" 的答案并且对示例 int *p2 = &i;
(来自 Dan Olson 的回答)感到困惑
i
的地址不是 int,它类似于 0x02304,对吧?那么我们如何将它放入 p2
中呢?鉴于字节内存地址不是 int 类型,int 类型的 C 指针如何保存内存地址?
谢谢!
附言对于在这一点上感到困惑的任何人,我发现另一个有用的线程(虽然它没有为我回答这个问题)是 "What exactly is a C pointer if not a memory address"祝你好运。
最佳答案
我认为 int *p2 = &i;
令人困惑的原因是同时声明和实例化以及间距的综合效果。我会解释。
通常,对于指向整数的指针 p2
和整数 i
,写入“*p2
”会取消引用 p2
并给出位于地址 &i
的 int
。
所以代码“int *p2 = &i;
”让它看起来像一个 int
被设置为等于一个内存地址。
确实是代码
int i = 1;
int *p2;
*p2 = &i
是错误的,因为在最后一行中,*p2
是一个 int
因为它是 p2
解引用的,并且 &i
是一个指针。
为什么 int *p2 = &i;
做的事情与上面有缺陷的代码的最后一行不同:
代码int *p2 = &i;
与上面3行代码不同,因为它是一个声明。当你声明一个指针变量时,你把类型(例如 int
、long
、char
等)和你的名字变量(像正常一样) - 你还在这两部分之间放了一个星号 *
(请参阅上面关于许多间距选项的@chqrlie回答 - takehome是最好的做法是坚持*
到变量名)。在声明中,*
不是取消引用指针。相反,它告诉编译器变量 myPointer
将是指向内存的指针,该内存保存已声明类型的数据(int
、long
、 char
等)。因此,在代码“int *p2 = &i;
”中,同时声明和实例化指针的地方,*
不会呈现 int
在左边。对于声明,虽然将 *
放在变量名称旁边更安全(正如@chqrlie 指出的那样),但即使在声明中实例化了指针,这也不会打开指针。对于声明,将 *
视为附加到类型(而不是附加到变量名,这是有充分理由的)。我喜欢在指针名称旁边用 *
声明指针,但只要了解在声明中实例化指针时,对于新学习者来说,想象该行的一种可能更清晰的方式是 int* p2 = &1
:
int*
(type pionter-to-int) p2
(指针名称) = &i
(等于给出地址的指针整数 i
) ;
感谢所有回答和评论的人,祝所有可能来到这里试图弄清楚指针的人好运。
关于c - 鉴于字节内存地址不是 int 类型,int 类型的 C 指针如何保存内存地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38557911/
美好的一天!我试图添加两个字节变量并注意到奇怪的结果。 byte valueA = 255; byte valueB = 1; byte valueC = (byte)(valueA + valueB
嗨,我是 swift 的新手,我正在尝试解码以 [Byte] 形式发回给我的字节数组?当我尝试使用 if let string = String(bytes: d, encoding: .utf8)
我正在使用 ipv4 和 ipv6 存储在 postgres 数据库中。 因为 ipv4 需要 32 位(4 字节)而 ipv6 需要 128(16 字节)位。那么为什么在 postgres 中 CI
我很好奇为什么 Go 不提供 []byte(*string) 方法。从性能的角度来看,[]byte(string) 不会复制输入参数并增加更多成本(尽管这看起来很奇怪,因为字符串是不可变的,为什么要复
我正在尝试为UDP实现Stop-and-Wait ARQ。根据停止等待约定,我在 0 和 1 之间切换 ACK。 正确的 ACK 定义为正确的序列号(0 或 1)AND消息长度。 以下片段是我的代码的
我在下面写了一些代码,目前我正在测试,所以代码中没有数据库查询。 下面的代码显示 if(filesize($filename) != 0) 总是转到 else,即使文件不是 0 字节而是 16 字节那
我使用 Apache poi 3.8 来读取 xls 文件,但出现异常: java.io.IOException: Unable to read entire header; 0 by
字典大小为 72 字节(根据 getsizeof(dict) 在字典上调用 .clear() 之后发生了什么,当新实例化的字典返回 240 字节时? 我知道一个简单的 dict 的起始大小为“8”,并
我目前正在努力创建一个函数,它接受两个 4 字节无符号整数,并返回一个 8 字节无符号长整数。我试图将我的工作基于 this research 描述的方法,但我的所有尝试都没有成功。我正在处理的具体输
看看这个简单的程序: #include using namespace std; int main() { unsigned int i=0x3f800000; float* p=(float*)(
我创建了自己的函数,将一个字符串转换为其等效的 BCD 格式的 bytes[]。然后我将此字节发送到 DataOutputStram (使用需要 byte[] 数组的写入方法)。问题出在数字字符串“8
此分配器将在具有静态内存的嵌入式系统中使用(即,没有可用的系统堆,因此“堆”将只是“char heap[4096]”) 周围似乎有很多“小型内存分配器”,但我正在寻找能够处理非常小的分配的一个。我说的
我将数据库脚本从 64 位系统传输到 32 位系统。当我执行脚本时,出现以下错误, Warning! The maximum key length is 900 bytes. The index 'U
想知道 128 字节 ext2 和 256 字节 ext3 文件系统之间的 inode 数据结构差异。 我一直在为 ext2、128 字节 inode 使用此引用:http://www.nongnu.
我试图理解使用 MD5 哈希作为 Cassandra key 在“内存/存储消耗”方面的含义: 我的内容(在 Java 中)的 MD5 哈希 = byte[] 长 16 个字节。 (16 字节来自维基
检查其他人是否也遇到类似问题。 shell脚本中的代码: ## Convert file into Unix format first. ## THIS is IMPORTANT. ###
我们有一个测量数据处理应用程序,目前所有数据都保存为 C++ float,这意味着在我们的 x86/Windows 平台上为 32 位/4 字节。 (32 位 Windows 应用程序)。 由于精度成
我读到在 Java 中 long 类型可以提升为 float 和 double ( http://www.javatpoint.com/method-overloading-in-java )。我想问
我有一个包含 n 个十进制元素的列表,其中每个元素都是两个字节长。 可以说: x = [9000 , 5000 , 2000 , 400] 这个想法是将每个元素拆分为 MSB 和 LSB 并将其存储在
我使用以下代码进行 AES-128 加密来编码一个 16 字节的 block ,但编码值的长度给出了 2 个 32 字节的 block 。我错过了什么吗? plainEnc = AES.enc
我是一名优秀的程序员,十分优秀!