我正在学习c指针。我了解到数组名称本身就是一个指针。
int a[5]={ 1 , 2 , 3 , 4 , 5 };
int *b = &a;
我的理解:
a[5] --> a contains base address
consider a is at the location of 0x100 so a[5] = 0x100 + ( 5 * size_of_integer ) = 0x100 + ( 5 * 4 ) = 0x100 + ( 20 ) = 0x120b = &a; // b = 0x100 b[0] = 0x100 b[1] = 0x104
a [0]和b [0]之间有什么区别吗? (我是初学者,我可能错了)
答案 0 :(得分:0)
a
是int a[5]
数组。 a
指向第一个(a[0]
)元素。 b
是指向a
的指针。您可以使用以下代码进行检查:
#include <stdio.h>
int main()
{
int a[5] = {1, 2, 3, 4, 5};
int *b = &a;
printf("a %p\n", a); // (1) address of a array.
printf("a[0] %p\n", &a[0]); // (2) address of first element of a array
printf("b %p\n", b); // (3) address of b
printf("b[2] %p\n", &b[2]); // (4) means [address of b] + 2 * sizeof(int)
printf("a[2] %p\n", &a[2]); // (5) third element of array
return 0;
}
(1)=(2)=(3)and(4)=(5)
另外b[0] = 1
不要解决(例如0x100
)和b[1] = 2
。
printf("b[0] %d\n", &b[0]);
printf("b[1] %d\n", &b[1]);
答案 1 :(得分:0)
我了解到数组名称本身就是一个指针? 没有数组名称本身不是指针。
数组名称本身表示数组的基址,并且该地址是常量,即如果a++
被声明为整数数组,则无法执行a
。
int a[5]={ 1 , 2 , 3 , 4 , 5 };
int *b = &a;
让我们比较a[2]
&amp; b[2]
,我们首先展开a[2]
。
a[i] == *(a + i)
a[2] == *(0x100 +2 * 4)
== *(0x108)
== 3
现在考虑b[2]
,让我们展开它。
b[2] == *(b + 2)
== *(0x100 +2 * 4) = *(0x108)
== 3b[2]
a[2]
和b[2]
都会产生相同的输出,但这并不意味着两者都相同,即a
是数组而b
是指针。
a++ ; /* not possible as a is an array, it can't look to some other addrerss */
b++ ; /* possible as b is pointer, it can point to any address */
答案 2 :(得分:-2)
a包含基地址,&amp; a包含存储该基地址的位置地址。
我的意思是a的值给你基地址。 如果你使用b =&amp; a(这将分配存储基地址的地址) 和b = a(将a的值(其为Array的基址)分配到b) 所以如果你使用b = a那么b [0] = a [0],否则两者都不同。
希望这会对你有所帮助..