作为c语言的特色,也可以说是精华,指针实质名归!另一大组成部分--数组,总是和指针糅合在一起操作内存,不得不提的是c语言的难点就是内存管理,而与内存关系最为密切就是数组和指针,导致初学者学习起来很困难,并且在产生错误的时候很难发现错误并改正,需要耐心的调试和查看变量的值。基于这一点,以下就是本人在学习数组和指针的时候一些经验,分享给大家。

    一.首先看我在学习这一阶段画的一幅图

理解数组与指针不可缺少的东西_指针和数组

    1).指针

     (1).指针就是指针,指针变量在32为系统下,永远占4个byte.其值为某一个内存的地址,指针可以指向任何地方。

       eg:编译器的bug(vc6.0)

           int *p = (int *)ox12ff7c;  //这个地址必须是内存开始给变量分配地址的第一个,要不是不会有作用!
           *p = NULL;
           p = NULL;

    在执行完第二条语句的时候,发现p的值变成了0x00000000了,为什么会这样?就不得不提到vc6.0这个98年的软件,它在给变量分配内存的时候总是从固定的地方开始,哪么分析一下我们上面的代码,定义一个指针变量,此时,编译器给指针分配的地址是0x12ff7c,然后给它初始化,将0x12ff7c放到指针变量中,等价于这个指针变量指向自己。当你给指针赋值为NULL的时候,同样把指针变量的值也改掉了。这难道真是编译器的bug么?答案是否定的。因为你就实现了这样一个功能。可以这样改代码:

           int i = 10;
           int *p = NULL;
           *p = NULL;
           p = NULL;

    就会发现这样是正常的!需要提的一点是,在其他高版本的编译器中,不会出现这样的现象。因为编译器才分配内存的时候,是动态的,不是从固定位置开始。

    (2).int *p = NULL 和 *p = NULL有什么区别

       可以在whath中查看这两句执行后 p和*p 的值。第一句话的意思是定义一个整型指针p(其指向的内存中存放一个整型变量)并给它赋初值,既p的值为NULL,不指向任何地址,此时p的值是0c00000000。第二句话的意思是,是将指针指向的内存的值变成0;看一段代码:

            int i = 10;
            int *p = &i;
            *p = NULL;

       在编译器中查看i的值变成了0;

    2).数组

     (1)数组就是数组,其大小是与元素的个数和类型有关系的。定义数组的时候要给出大小和类型,数组可以储存任何数据,函数除外。

      (2)sizeof 关键字

      eg:

           
int main()
{
	int a[] = { 1, 2, 3, 4 };
	printf("%d\n", sizeof(a));//16
	printf("%d\n", sizeof(a + 0));//4
	printf("%d\n", sizeof(*a));//4
	printf("%d\n", sizeof(a + 1));//4
	printf("%d\n", sizeof(a[1]));//4
	printf("%d\n", sizeof(&a));//4
	printf("%d\n", sizeof(&a + 1));//4
	printf("%d\n", sizeof(&a[0]));//4
	printf("%d\n", sizeof(&a[0] + 1));//4
	system("pause");
	return 0;
}

    数组名不发生降级的两种情况,一种是sizeof(a);一种是&a;

    二.指针和数组的定义和声明

    1).定义为指针,声明为数组。

     文件1:char * = "abcdefg";

     文件2:extern char p[];

    在文件1中,编译器为指针变量分配4个字节,并命名为p。同时p中保存了字符串常量“abcdefg”的首元素地址。这个字符串常量本来是保存在静态区,其内容不可以更改。在文件2中,编译器认为,p是一个数组,其大小为四个字节,数组保存的是char类型的数据。

    2).定义为数组,声明为指针。

     文件1: char a[100];

     文件2: ectren char *a;

    在文件1中,定义一个char类型的数组,大小为100个字节。可是在文件2中声明为指针,只认4个字节。这里可以强制类型转换!

    数组和指针这里面还有许多东西,比如,数组指针,指针数组等等,将在下一篇博客中和大家见面。

   以上就是本人在学习过程中的一些经验总结。当然,本人能力有限,难免会有纰漏,希望大家可以指正。