C语言---数组和指针

令人震惊的事实:数组和指针并不相同 

文件1:

int  my_array[5];

文件2:

extern int * my_array;

这样的程序能不能运行呢?肯定是不能运行的

这里文件1定义了一个数组my_array,但文件2申明它为指针。这有什么错误吗?,无论如何,“每个人都知道”在C语言中,数组和指针非常相似。问题 在于“每个人”这种说法是错误的。

定义和申明的区别:

定义:只能出现在一个地方,确定对象的类型并分配内存,用于创建新的对象。例如:int  my_array[5];

申明:可以出现多次,描述对象的类型,用于指代其他地方定义的对象。例如:entern int  my_array[];

extern对象申明告诉编译器对象的类型和名字,对象的内存分配则在别处进行。由于并未在申明中为数组分配内存,所以并不需要提供关于数组长度的信息。

 数组名与指针

#include<stdio.h>

int main(int argc, char *argv[])
{
    int a[5] = {1, 2, 3, 4, 5};
    int *p = (int *)(&a + 1);
    printf("%p %p %p %p\r\n", &a, a, &a[0], p - 5);
    printf("%p %p %p %p\r\n", &a + 1, a + 1, &a[0] + 1, p);
    printf("%d %d\r\n", *(a + 1), *(p - 1));

    return 0;
}
/**输出结果
0028FEF8 0028FEF8 0028FEF8 0028FEF8
0028FF0C 0028FEFC 0028FEFC 0028FF0C
2 5
*/

 

#include<stdio.h>

int main(int argc, char *argv[])
{
    int a[5] = {1, 2, 3, 4, 5};
    int *p = &a;
    int *q = a;

    printf("%p %p %p %p\r\n", &a, a, &a[0], p);
    printf("%p %p %p %p\r\n", &a + 1, a + 1, &a[0] + 1, p + 1);
    printf("%d %d\r\n", *(q + 1), *(p + 1));

    return 0;
}
/**输出结果
0028FEF4 0028FEF4 0028FEF4 0028FEF4
0028FF08 0028FEF8 0028FEF8 0028FEF8
2 2
*/
#include <stdio.h>

int main(int argc, char **argv)
{
    int a[10];

    printf("---------------- \r\n");
    printf("%p \r\n", a);
    printf("%p \r\n", &a);
    printf("%p \r\n", &a[0]);

    printf("---------------- \r\n");
    printf("%p \r\n", a + 1);
    printf("%p \r\n", &a[1]);
    printf("%p \r\n", &a + 1);
    printf("%p \r\n", &a[10]);
    printf("---------------- \r\n");

    return 1;
}
/** 输出结果
----------------
0x7fffed2ddb50
0x7fffed2ddb50
0x7fffed2ddb50
----------------
0x7fffed2ddb54
0x7fffed2ddb54
0x7fffed2ddb78
0x7fffed2ddb78
----------------
*/
/************************** end of fiel **************************/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值