以下问题可能对社区重复,但有时您需要在脑海中提出确切的问题才能正确理解问题。我试图彻底了解指针。当主持人说使用& pointername [下标]打印数组的每个元素的地址时,我正在观看视频。我的问题是为什么不只是指针。在执行j ++之后的下面的代码中,J不会有数组元素的地址吗?我为什么要使用& j [k]? & j [k],j(如果有)
之间有什么区别?#include <stdio.h>
void main()
{
int i[] = {1, 2, 3, 4, 5}, *j, k;
j = i;
for (k = 0; k < 5; k++)
{
printf("%p, %p, %p\n", &j[k], j, i);
j++;
}
}
谢谢,
萨哈娜
答案 0 :(得分:3)
你是对的:
j=i
,j
指向数组i
中的第一个元素。从现在起,j[k]
将指向与i[k]
相同的内存位置。j[k]
,您将检索数组中k
个单元格的数据。所以j[k]
是一个int。&
。答案 1 :(得分:3)
在大多数情况下,当您在C中引用数组时,您自动获得的是指向数组第一个元素的指针。换句话说,当你写了
cmake_minimum_required(VERSION 2.8)
OPTION(FOO "Foo Option" OFF)
SET(FOO ON) # Don't do this
MESSAGE("FOO? " ${FOO})
完全就像你写过
一样j = i;
这进一步意味着当你写作
j = &i[0];
它完全等同于
i[k]
这意味着
*(i + k)
将始终等于
&i[k]
在您的计划中,i + k /* or &i[0] + k */
等于j[k]
也是如此,这意味着*(j + k)
等于&j[k]
。
看起来您的程序正在尝试演示这些等效性,但这会让您感到困惑,因为您要j + k
和按j
递增j
。这是您的程序版本,应该更清楚地说明发生了什么。 (除此之外,我已将数组的名称更改为k
,因为“i”是数组的非常令人困惑的名称!同样,我已更改a
到j
。)
p
答案 2 :(得分:1)
在C中,&ptr[index]
完全与ptr+index
甚至&index[ptr]
完全相同
并且数组衰减成指针,特别是在将它们作为参数传递时(例如传递给printf
)。
准确阅读您最喜爱的C编程书中衰减数组的含义。请注意,sizeof
在应用于数组或指针时不同。因此,在我的Linux / x86-64桌面上使用int arr[5];
:当传递arr
作为参数时,它会被衰减为指针,因此与&arr
或&arr[0]
相同;但sizeof(arr)
为20,sizeof(&arr)
为8(有些sizeof(ptr)
之后为int*ptr = &arr[3];
)且sizeof(arr[0])
为4。
答案 3 :(得分:0)
简单地
#include <stdio.h>
int main() {
int i[] = { 1, 2, 3, 4, 5 }, j;
for (j = 0; j < 5; ++j)
printf("%p\n", &i[j]);
return 0;
}
<强>输出强>
0xbff22d8c
0xbff22d90
0xbff22d94
0xbff22d98
0xbff22d9c