C语言 指针与数组

int main()

{

  int a[5] = {555,444,333,222,111};

  int *p;

  p = &a;            //数组a的首地址 

  p = &a[0];          //数组a首元素的地址

  p = a;               //数组a首元素的首地址

 

       a = p;           //编译就会报错,因为数组名是个常量,所以不能赋值,所以数组名不能做左值。

  printf("*p = %d\n", *p);  //结果都是 *p = 555

       p +=1;    //指针+1;表示指向下一格

       printf("*p = %d\n", *p);//结果就是444

}

注:

  1、数组名:做右值时,数组名表示数组的首元素首地址,因此可以直接赋值给指针。

             int a[5];   //而a和&a[0]都表示数组首元素a[0]的首地址;而&a则表示数组的首地址。

  2、数组首元素的首地址和数组的首地址是不同的。前者时数组元素的地址,而后者是数组整体的地址。两者的含义不同,但是数值上是相同的。

根据上边,我们知道可以用一个指针指向数组的第一个元素,这样就可以用间接访问的方式去逐个访问数组中各个元素,这样访问数组就有了两种方式。

int a[5]; int *p; p = a; 

以数组的方式逐个访问: a[0]                 a[1]                 a[2]                  a[3]                  a[4]

指针的方式逐个访问:    *p                    *(p + 1 )     *(p + 2 )       *(p + 3 )      *(p + 4 )

注:

  指针本身也是一种变量,因此也可以进行运算。但是因为指针变量本身存的是某个其他变量的地址值,因此该值进行 * / %等运算是没有意义的。指针变量+1代表指针所指向的格子向后挪一格,-1代表指针所指向的格子向前挪一格。

posted @ 2019-06-24 20:57  志瞳道合  阅读(238)  评论(0)    收藏  举报