- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试以下代码
#include<stdio.h>
int main()
{
int A[3][4] = {{1,2,3,4},{5,6,7,8,},{9,10,11,12}};
int **t = &A[0]; //I do this or **t = A,I guess both are equivalent
printf("%d %p\n\n",*t,A[0]);
return 0;
}
我期望发生的事情:
现在 t 是一个 2d 指针(指向指针的指针),其中包含 A[0] 的地址,而 A[0] 又包含 A[0][0] 的地址。所以 *t 应该给我 A[0] 的值,即 A[0][0] 的地址,而 **t 应该给我 A[0][0] 的值,在这种情况下是 1 .
我得到的:
*t 的值为 1。尝试查找 **t 是不可能的,因为它会导致段错误。
谁能告诉我为什么会这样?
我尝试了以下解释,但不确定它是否是“正确”的解释。 t 保存 A[0] 的地址,但由于 A 是数组而 A[0] 是数组指针(“不完全”是指针),C 不会为指针 A 或 A[0] 分配内存特别是 UNLIKE 其他指针变量。它只为整个数组分配内存。因此 A[0] 和 A[0] 的地址(即 A[0][0] 的地址)本质上是相同的,都属于同一个屋檐下,不像“单独的”实体。结果 t 反过来间接持有 A[0][0] 的地址,*t 给出 A[0][0] 的值,即 1。
上面的解释对吗?有点奇怪。
最佳答案
数组不是指针。
嗯,还有更多...
多维数组不是二重、三重等指针。
因此,您所拥有的一切都是错误的,您的程序多次调用了未定义的行为,并且没有什么是您可以期待的。
鉴于数组在内存中是连续的,您可以这样重写您的示例:
int A[3][4] = {{1,2,3,4},{5,6,7,8,},{9,10,11,12}};
int *p = &A[0][0];
printf("%d %d %p\n", A[0][0], *p, (void *)p);
关于c - 等同于两个二维指针-二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15980747/
判断这2个相似的Uris实际上相同的标准方法是什么? var a = new Uri("http://sample.com/sample/"); var b = new Uri("http://sam
这个问题在这里已经有了答案: Why does "true" == true show false in JavaScript? (5 个答案) 关闭 5 年前。 可能我很困惑,但我无法理解这个愚蠢
我是一名优秀的程序员,十分优秀!