a [1]和b [1]之间有什么区别?

时间:2017-11-11 06:58:55

标签: c arrays pointers base-address

我正在学习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 ) = 0x120

b = &a; // b = 0x100 b[0] = 0x100 b[1] = 0x104

a [0]和b [0]之间有什么区别吗? (我是初学者,我可能错了)

3 个答案:

答案 0 :(得分:0)

aint 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],否则两者都不同。

希望这会对你有所帮助..