- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在此代码中:
#include<stdio.h>
int main()
{
int num[2] = {20, 30};
printf("%d", num);
printf("%d", &num[0]);
return 0;
}
据我所知,两个printf语句都会打印num
中第一个元素的地址,因为在第一个语句中,num
是一个指向int的指针.
但是如果 num
是一个指针,那么它也应该有任何地址,但在打印其地址时(使用 printf("%d", &num)
),它是显示第一个元素的地址。
在二维数组中,整个事情也变得困惑:
#include<stdio.h>
int main(void)
{
int num[ ] [2]={20,30,40,50};
printf("%d",*num);
return 0;
}
该程序正在打印第零个元素的地址,即num[0][0]
的地址。但它为什么要这样做呢?为什么它不打印存储在其中的值,因为它们都有相同的地址(num,num[0]
和 num[0][0]
)?
最佳答案
要事第一;数组变量不是指针;它们不存储任何东西的地址。
对于诸如这样的声明
T a[N];
内存将布局为
+---+
a[0]: | |
+---+
a[1]: | |
+---+
...
+---+
a[N-1]: | |
+---+
对于 2D MxN 数组,它看起来像
+---+
a[0][0]: | |
+---+
a[0][1]: | |
+---+
...
+---+
a[0][N-1]: | |
+---+
a[1][0]: | |
+---+
a[1][1]: | |
+---+
...
+---+
a[M-1][N-1]: | |
+---+
对于 3D 和更高维的数组,该模式应该是明显的。
如您所见,没有为包含第一个元素的地址的单独变量a
预留存储空间;相反,C 语言中有一条规则,类型为“T
的 N 元素数组”的表达式将被转换(“衰变”) ") 到“指向 T
”类型的表达式,表达式的值将是数组第一个元素的地址,除非当数组表达式为以下之一:
sizeof
运算符的操作数&
运算符的操作数_Alignof
运算符的操作数(C99 及更高版本)因此给出声明
T a[N];
以下所有内容均正确:
Expression Type Decays to Value
---------- ---- --------- -----
a T [N] T * address of first element, &a[0]
*a T n/a value stored in first element
&a T (*)[N] n/a address of the array, which is
the same as the address of the
first element of the array
a[i] T n/a value stored in the i'th element
&a[i] T * n/a address of the i'th element
sizeof a size_t n/a total number of bytes used by the
array
sizeof *a size_t n/a total number of bytes used by the
first element of the array
sizeof &a size_t n/a total number of bytes used by a
pointer to the array
表达式a
的类型为“T
的N元素数组”;它不是一元 &
或 sizeof
运算符的操作数,因此它被转换为指向数组第一个元素的指针,amd 它的值是该元素的地址元素。
表达式&a
的类型为“指向T
的N元素数组的指针”;由于 a
是一元 &
运算符的操作数,因此不应用上面的转换规则(这就是表达式具有类型 T (*)[N ]
而不是 T **
)。但是,由于数组的地址与数组第一个元素的地址相同,因此它产生与表达式 a
相同的值。
表达式&a[0]
的类型为“指向T
的指针”,并显式指向数组的第一个元素。同样,该值将与前两个表达式相同。
对于二维数组
T a[M][N];
以下所有内容均正确:
Expression Type Decays to Value
---------- ---- --------- -----
a T [M][N] T (*)[N] address of first subarray, a[0]
*a T [N] T * address pf first subarray, a[0]
&a T (*)[M][N] n/a address of the array, which is
the same as the address of the
first subarray, which is the same
as the address of the first element
of the first subarray.
a[i] T [N] T * address of first element of i'th
subarray
*a[i] T n/a value of first element of i'th subarray
&a[i] T (*)[N] n/a address of the i'th subarray
sizeof a size_t n/a total number of bytes used by the
array
sizeof *a size_t n/a total number of bytes used by the
first subarray
sizeof &a size_t n/a total number of bytes used by a
pointer to the array
最后一点:要打印指针值,请使用 %p
转换说明符并将参数强制转换为 (void *)
(这几乎是唯一一次将指针显式转换为 void *
被认为是正确的):
printf( " &a yields %p\n", (void *) &a );
printf( " a yields %p\n", (void *) a );
printf( "&a[0] yields %p\n", (void *) &a[0] );
编辑
回答评论中的问题:
num,num[] and num[][] are all different thing. There types are different.Here num decays and became pointer to a pointer and num[] decays and became pointer to int and num[][] is a int. Right?
不完全是。
假设声明如下
int arr[10][10];
然后表达式arr
将衰减为类型int (*)[10]
(指向int
的10个元素数组的指针),不是 int ** ;再次引用上表。否则你是对的; arr[i]
将衰减为 int *
类型,并且 arr[i][j]
将具有 int
类型>。
“T
的 N 元素数组”类型的表达式衰减为“指向 T
的指针”类型;如果 T
是数组类型,则结果是“指向数组的指针”,而不是“指向指针的指针”。
关于c - 为什么 *num 不显示第零个元素值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26588906/
在开发中的网页上,我在 IE 上遇到此错误 element = $(element); 此代码位于prototype.js 预期对象 如何消除此错误。 更新: 现场也使用了 jQuery。 最佳答
我有两个大小相同的嵌套数组: Array1 =[[1, 2], [], [2, 3]] Array2= [[1, 4], [8, 11], [3, 6]] 我需要将它们合并到一个数组中,如下所示: A
我有一些 jQuery 代码,当单击具有特定 ID 的项目时运行。当 ID 是 的一部分时,它就可以工作。元素,但当它位于 中时则不然元素。为什么会这样呢?我想使用 an,因为如果用户关闭了 Ja
Flex-box 规范 3声明 flex 元素不是 block 容器: A flex item establishes a new formatting context for its content
我遇到了一个意想不到的问题。 HTML JS $(function() { var $divs = $('.myDiv'); // create new div not in
我使用 Bootstrap 和 Ember.js 得到了一个无序列表。每个列表项都是一个显示新帖子的链接,每当您单击该链接时,Ember 都会添加类 active默认情况下。我正在使用 Bootstr
我正在尝试让一个函数正常工作,但运气不佳,所以我想向 Stackoverflow 智囊团提出一个新手问题! 基本上,我有一个表单,并且循环遍历所有元素以查看是否存在自定义数据属性。如果存在,则保持该元
我想映射一个可选数组,删除那些 nil 值,并使用另一个函数映射非 nil 值。 我知道我可以通过使用 compactMap 然后使用常规 map 来实现这一点,但我只想遍历数组一次。 我为此实现了一
我如何定位 li 元素,除非它们出现在 之后元素?换句话说,我想针对步骤而不是注释。 我尝试向 OL 添加一个我想从选择中排除的类,但我想出的代码不起作用。 (顺便说一句,重构 html 不是一种选
Warning 1 The element 'system.webServer' has invalid child element 'rewrite'. List of possible eleme
我正在尝试编写一个脚本,该脚本将遍历 HTML 源并创建 DOM 的 JSON 文件,然后使用 d3.js 在 TreeView 中显示该文件。我遇到的问题是不仅希望显示元素(TITLE、P、LI 等
我有以下 HTML 表单:- Option 1 Option 2
我试图在选定的 HTML 元素之后选择下一个具有类名 slider-value 的 span 元素。我尝试了多种解决方案,但没有一个有效。 我可以通过 id 选择它,但我不希望那样做使代码冗余。 $(
如果电子邮件地址无效,我想在屏幕上显示一条消息“请输入有效的电子邮件地址”。 body 元素的innerHTML 语句工作正常,但我用于p 元素的innerHTML 语句不起作用。 有一次,当我测试它
以下 jQuery 代码调用 ul 元素,查找元素内的前 三个 li 列表项,并隐藏剩余的 li 项目。然后,它附加一个 li 元素,其中显示“显示更多...”,并且在单击时显示之前隐藏的列表项。 (
我问了a question早些时候关于将编辑/删除链接与 h1 元素内联的最佳方法。我能够通过给出的答案实现这一点,但我现在有额外的要求,我需要在 h1 下方显示一个段落并编辑/删除链接。 到目前为止
我使用 MVC 4 和 knockout.js 库版本 2.1.0 显示从服务器检索到的大量文件的表中的以下摘录。 0)"> 正在正确检索数据,
我创建了一个脚本,该脚本在鼠标悬停在父容器上时激活,并且应该将其子元素移离鼠标。我目前已经让它工作了,但是代码的某些部分似乎与 REACT 代码应该是什么样子相矛盾。特别是两个部分。 我在渲染函数中使
我是 JS 新手,正在尝试理解项目 https://github.com/tastejs/todomvc 的代码 请参阅屏幕截图,我尝试对 button X 以及其父元素 div 设置断点,但在这两种
例如,假设有一个带有奇特颜色的标记: Something written here 使用 Visual Studio 2017 和 MVC 5 元素,有没有办法检查和定位当前应用了哪些样式,以及负责它
我是一名优秀的程序员,十分优秀!