例如,假设你有一个数组a和一个指针p。这就是它的运作方式。
void main() {
int a[10];
int *p;
for(i = 0;i <=10;i++)
a[i] = (i + 1) * 2;
p = &a[0];
printf("%d",a[4]);
printf("%d",p[4]);
}
他们如何平等?
答案 0 :(得分:4)
为什么数组的第一个元素等于数组?。假设您有一个整数数组,如int arr[5];
,然后根据您的问题标题
arr[0]
,其值为arr[0]
和arr
和arr
名称表示数组的基址。因此arr
和arr[0]
不相同。 arr
是基地址&amp; arr[0]
是有价值的。 对于您的特定情况,整数数组a
如下所示&amp;数组的所有元素都存储在连续的内存位置。假设数组基址为0x100
(某些内存位置)
a[0] a[1] a[2] a[3] ........................................ a[9]
------------------------------------------------------------------------
| 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 |
------------------------------------------------------------------------
0x100 0x104 0x108 .. ..
a
LSB MSB
所以这里a
表示0x100
,假设a
的基地址为0x100
。现在当你做
p = &a[0]; /* here you are setting p to point to one of the places in the array a and that is a[0] */
此处p
指向first
的{{1}}元素,即a
,如下所示
0x100
现在,当您打印 a[0] a[1] a[2] a[3] ........................................ a[9]
------------------------------------------------------------------------
| 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 |
------------------------------------------------------------------------
0x100 0x104 0x108 0x112 0x116.. ..
a
|
p
时,它会打印a[4]
,这非常简单,正如预期的那样。它扩展如下
10
当您打印a[4] = *(a + 4) /* here you can say that array name a is converted to a pointer to its first element */
= *(0x100 + 4*4 ) /* multiplied by 4 ? bcz a is int array & each element size is 4 byte */
= *(0x116) /* value at 0x116 memory location */
= 10
时,它会像下面那样展开
p[4]
同时为for p[4] = *(p + 4)
= *(0x100 + 4*4) /*multiplied by 4 because int pointer increments by 4 bytes*/
= *(0x116) ? /* it prints value at 0x116 location which 10 */
= 10
中的数组元素分配值时,您尝试访问超出边界的loop
&amp;导致未定义的行为。在下面的代码块条件中,部分应为a[10]
而不是i<10
,因为您声明i<=10
并且数组索引从a[10]
开始。
zero
最后for(i = 0;i <=10;i++) { /* make it i<10 */
a[i] = (i + 1) * 2;
}
是不好的做法,它不符合C标准规范。请改为使用{标准void main() { /* code */ }
草案中指定的int main(void) { }
。
5.1.2.2.1程序启动
1程序启动时调用的函数名为main。该 实现声明此函数没有原型。应该是 使用返回类型int定义并且没有参数:
n1256
或有两个参数(这里称为argc和argv,尽管如此) 可以使用名称,因为它们是它们所在的函数的本地名称 声明):
int main(void) { /* ... */ }
或等效的; 9)或其他一些实现定义的方式。
答案 1 :(得分:2)
Array definition:数组是放置在连续内存位置的一系列相同类型的元素,可以通过向唯一标识符添加索引来单独引用。
当您获取数组的第一个元素(&a[0]
)的地址时,您将获得与a
完全相同的值。 (但是你会丢失大小信息,因为&a[0]
是指向内存的指针,其中a
实际上是数组)
这是因为a[0]
实际上转换为*(a + 0)
,其中a
是指向数组所在内存地址的指针。因此,&a[0]
变为&(*(a + 0))
或“地址a + 0
内容的地址”,与“地址a
”相同
同样,a[4]
会转换为*(a + 4)
。
我希望这能澄清事情:)
编辑:
我刚找到这个页面,您可以在这里阅读更多相关信息: https://www.le.ac.uk/users/rjm1/cotter/page_59.htm
编辑2:
澄清了&a[0]
和a
答案 2 :(得分:1)
数组存储在传染性存储器中,而[0]是指向第一个元素的指针。现在,如果你想获得第二个指针引用(第一个元素的地址+ sizeof(int))。现在你可以通过*(第一个元素的地址+ sizeof(int))访问它的值。这叫做指针算术。你必须参考一本好书来了解它。
答案 3 :(得分:0)
您指定了指针'p'指向本地数组'a', 所以从现在起'p'和'a'是相同的数组, 你对'p'所做的每一个改变都会直接影响'a',反之亦然。
p = &a[0];
答案 4 :(得分:0)
在[10]中,a是指向数组第一个元素地址的指针。所以当你分配:
p = &a[0];
P也在a的地址存储相同的地址并指向同一个元素。因此对p进行的任何操作都将反映在。
中答案 5 :(得分:0)
当你写作 P =&安培;一个[0]; 是相同的 P = A; 现在p和a是同一个数组开头的指针