- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我现在的理解是。
int a = 100;
int *a_ptr; // creates pointer variable named a_ptr and points to type int
a_ptr = &a; // a_ptr is address of a
*a_ptr = 5; // value of pointer = value of a now set to 5.
我不明白的是指针的意义在于占用另一个变量的地址作为其正确的值或内容不是吗?
如果 *a_ptr
是值不应该是 *a_ptr = &a;
?
谢谢
最佳答案
将指针想象成路标:它告诉您在哪里可以找到东西。仅此而已。指针存在的值(value)/原因是因为它是一个我们实际上非常熟悉的概念。 C 按值传递所有内容。让我们使用一个牵强附会的类比,我相信它会为您澄清一些事情:
想象一下,你去度假并告诉别人你住过的酒店。你不会详细描述,而是告诉对方姓名、地址,也许更多信息可以帮助某人找到该地点的详细信息。您不会着手详细描述整件事,也不会拆掉酒店并随身携带,更不用说每次告诉别人时都重建它了.
回到 C:C 按值传递所有内容。在这个类比中,这就像给每个人一个 1 比 1 比例的您赞不绝口的酒店复制品。这既昂贵又费时,而且真的很烦人。您将酒店副本提供给的人可以更改它,但您永远不会知道:有一个共同的起点(原始酒店),但此后每个副本都相互独立。
就像在现实生活中一样,您只需写下酒店的地址,然后将其分享给家人和 friend 。这就是 C 使用指针所做的事情:它告诉您在哪里可以找到某些东西(struct hotel
或 int
),其他人可以使用该地址前往它。
额外的好处是,如果您的一些 friend 真的去过那个地方,他们可以告诉您它在某些方面发生了变化:颜色现在是绿色,而不是蓝色,所有者已经改变,等等......
使用该地址可以让拥有该地址的每个人都可以访问有关该地点的最新信息。
如果酒店倒闭,地址就变得毫无意义,但当然,如果有人使用你给他们的地址并认为他们会住在一个好地方,他们就会生气。接下来会发生什么很难预测(未定义的行为)。
所以在恢复中:
int x = 123;// a hotel
int *x_address = &x;//an address to the hotel
int *for_friend = &x;
int *friend2 = &x; // you can hand out sever addresses to the same hotel
*x_address += 1; // read this as *(travel to)x_address to arrive at hotel X, and stay += 1 night or something
//friend2 wants to see how many nights were spent in hotel x:
printf("%d\n", *friend2);//124 -> 123 originaly + *x_address += 1
如果 x
超出范围,则相当于酒店关闭。如果某人 *x_address
(前往 x),则他们的行为未定义。
我过去用过不同的类比来解释你可以用什么方式来看待指针以使它们更容易理解,我已经写了一段时间了,不知道这是否让事情变得更清楚,但是我想我只是在这里发布链接:
关于有人可以帮我消除一些关于指针的困惑吗?在 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38833736/
我刚接触 C 语言几周,所以对它还很陌生。 我见过这样的事情 * (variable-name) = -* (variable-name) 在讲义中,但它到底会做什么?它会否定所指向的值吗? 最佳答案
我有一个指向内存地址的void 指针。然后,我做 int 指针 = void 指针 float 指针 = void 指针 然后,取消引用它们以获取值。 { int x = 25; vo
我正在与计算机控制的泵进行一些串行端口通信,我用来通信的 createfile 函数需要将 com 端口名称解析为 wchar_t 指针。 我也在使用 QT 创建一个表单并获取 com 端口名称作为
#include "stdio.h" #include "malloc.h" int main() { char*x=(char*)malloc(1024); *(x+2)=3; --
#include #include main() { int an_int; void *void_pointer = &an_int; double *double_ptr = void
对于每个时间步长,我都有一个二维矩阵 a[ix][iz],ix 从 0 到 nx-1 和 iz 从 0 到 nz-1。 为了组装所有时间步长的矩阵,我定义了一个长度为 nx*nz*nt 的 3D 指针
我有一个函数,它接受一个指向 char ** 的指针并用字符串填充它(我猜是一个字符串数组)。 *list_of_strings* 在函数内部分配内存。 char * *list_of_strings
我试图了解当涉及到字符和字符串时,内存分配是如何工作的。 我知道声明的数组的名称就像指向数组第一个元素的指针,但该数组将驻留在内存的堆栈中。 另一方面,当我们想要使用内存堆时,我们使用 malloc,
我有一个 C 语言的 .DLL 文件。该 DLL 中所有函数所需的主要结构具有以下形式。 typedef struct { char *snsAccessID; char *
我得到了以下数组: let arr = [ { children: [ { children: [], current: tru
#include int main(void) { int i; int *ptr = (int *) malloc(5 * sizeof(int)); for (i=0;
我正在编写一个程序,它接受一个三位数整数并将其分成两个整数。 224 将变为 220 和 4。 114 将变为 110 和 4。 基本上,您可以使用模数来完成。我写了我认为应该工作的东西,编译器一直说
好吧,我对 C++ 很陌生,我确定这个问题已经在某个地方得到了回答,而且也很简单,但我似乎找不到答案.... 我有一个自定义数组类,我将其用作练习来尝试了解其工作原理,其定义如下: 标题: class
1) this 指针与其他指针有何不同?据我了解,指针指向堆中的内存。如果有指向它们的指针,这是否意味着对象总是在堆中构造? 2)我们可以在 move 构造函数或 move 赋值中窃取this指针吗?
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: C : pointer to struct in the struct definition 在我的初学者类
我有两个指向指针的结构指针 typedef struct Square { ... ... }Square; Square **s1; //Representing 2D array of say,
变量在内存中是如何定位的?我有这个代码 int w=1; int x=1; int y=1; int z=1; int main(int argc, char** argv) { printf
#include #include main() { char *q[]={"black","white","red"}; printf("%s",*q+3); getch()
我在“C”类中有以下函数 class C { template void Func1(int x); template void Func2(int x); }; template void
我在64位linux下使用c++,编译器(g++)也是64位的。当我打印某个变量的地址时,例如一个整数,它应该打印一个 64 位整数,但实际上它打印了一个 48 位整数。 int i; cout <<
我是一名优秀的程序员,十分优秀!