c中数组名称的特殊之处

时间:2014-07-23 05:02:20

标签: c arrays

int a[5] = {1,2,3,4,5};                                           
int *ptr=(int *)(&a+1);
printf("%d,%d", *(a+1),*(ptr-1));

结果是2,5。 这是我的问题:为什么&a等于a?一个指向数组中第一个元素的指针,所以思考& a得到指针的地址是正确的吗?为什么&a的类型是int(*)[5]?这意味着&a< => a[0][5]? 如果我这样写:

int b = 1;
int *cx = &b;
int *dx = (int *)(&cx + 1);
printf("%d  %d", *(cx), *(dx -1));

会有一个问题。 c中数组名称有什么特别之处?

3 个答案:

答案 0 :(得分:1)

a[0][5]无效。您假设a是一个指针。 a不是指针。这是一个数组。它衰减到表达式中的指针。

&a是一个指向数组a的常量地址值。

答案 1 :(得分:0)

Array是存储在连续内存位置的类似数据类型的集合。

情况1:通常,数组名称表示数组的基址。根据这个a并给出基地址。您知道&a给出基地址

案例2:指向数组中第一个元素的指针,为您提供数组的基址。

int a[5] = {1,2,3,4,5};
int *ptr;
ptr=a;  // Here p holds the address of the first element in the array
ptr=ptr+1; // address incremented to next element. now it will point to 2
printf("%d\n",*ptr); // it prints 2.

案例3:来自您的代码 通常a&a是起始地址。 a+1表示将指向数组中的第二个元素。但是&a+1意味着它将指向下一个数组。它会增加整个数组的大小(在你的情况下意味着20个字节)。

int a[5] = {1,2,3,4,5}; // consider base address is 1000. so &a+1 is 1020. that is next array(but here you did not have).
int *ptr=(int *)(&a+1); // you are assigning 1020 address to ptr. for checking print the address of ptr
printf("%d,%d", *(a+1),*(ptr-1)); // as i told a+1 will point to 2nd element. so it prints 2. 
//ptr is pointing to 1020, you are decreasing one element so it point to 1016. the value at 1016 is 5.
//(how? 1 is 1000 means, 2 is 1004, 3 is 1008..... 5 is 1016(because integer needs 4 bytes of address for each elements)).

请记住,数组元素存储在连续的内存位置。

int b = 1; // consider address of b is 1000
int *cx = &b; // assingning to *cx
int *dx = (int *)(&cx + 1); // &cx is pointer address(it is not 1000, so consider &cx is 2000)
// &cx+1 means it points to 2004, and you are assigning to *dx
printf("%d  %d", *(cx), *(dx -1)); // here *(cx) will print 1. but *(dx-1) means it point to 2000. we dont know what value is there. 
// so it will print some garbage value.

答案 2 :(得分:0)

首先是一个数组名称,它只是指向数组第一个元素的指针(地址),它将包含存储数组第一个元素的内存位置值。

& a和a会给你相同的值,因为它只是一个指针。

考虑到你是一名班级老师并且已经和学生一起去博物馆,你必须跟踪100名学生,就像博物馆里有更多学生的教师一样。 因此,花了一段时间,你得到了所有这些。识别孩子并将他们拉到一起很困难。同样,如果数组名称不存在,则始终难以跟踪元素。 幸运的是,课堂上总有一个导师男孩总是让学生们在一起,如果你找到他,你会发现所有100名学生:)。 同样,我们有指针名称,它存储第一个元素的地址。只有使用它才能获得数组的所有元素。这意味着要跟踪100个元素(学生)我只需要保留一个地址(数组名称或指导者名称),而不是全部。因此,跟踪和访问变得非常简单。

很抱歉让我厌倦了我的故事,但它可以让你感受到特殊阵列的感受。

您可以运行以下代码,以清楚了解它在内存级别的工作原理:

int a[5] = {1,2,3,4,10};                                           
int *ptr=(int *)(&a+1);
printf("%d\n",a);
printf("%d\n",&a[0]);
printf("%d\n",&a[1]);
printf("%d\n",&a[2]);
printf("%d\n",&a[3]);
printf("%d\n",&a[4]);
printf("%d\n",(&a+1)); 
printf("%d\n",(ptr-1));
printf("%d,%d", *(a+1),*(ptr-1));

希望有所帮助