数组与指针

指向数组的指针

一、数组与指针的关系:

1.数组:

  数组名表示数组的首地址——数组名是一种指针;

  数组名表示的地址不能改变——指针常量。

2.数组的指针

  =数组的起始位置=与数组名表示的指针相同 =数组的第一个元素的地址相同

二、数组和指针用法区别:

 1.定义指针时:只分配一段用来存放地址的空间,没有分配存放数据的空间;

 2.定义数组时:为所以元素分配相应的连续的存储空间,但没有存放地址的空间。

 三、指针对数组的引用:

1.指针指向数组的首地址;数组名代表数组首元素的a[0]地址,即相当于&a[0];

例: int a[4]

(1) &a 是“指向数组”的指针;

  &a+1将跨越16个字节:数组a四个元素,每个元素占4个字节

  &a相当于管辖范围“上升”一级;

注:&a 指向整个数组,a指向首元素,但是所指向的地址相同;

(2)* a  是数组的第一个元素a[0]; *a等价于a[0];

  *a 相当于管辖范围“下降”一级;

2. a==*p==a[0]

    a[i]==*(p+i)

3.利用指针引用数组

 1.定义

  数组int a[10];  指针 int*pointer;

 2.赋值 

  pointer=a;    等价于pointer=&a[0];

 3.数组访问:

  pointer+i;    等价于a=i;   等价于&a[i];

  *(pointer +i); 等价于*(a+i)等价于 a[i];

注意易错:

指针运算:int *p=&a[0];

 1. a++:   没有意义,数组名的值不能改变,是非法操作;

  p++p + / - 指针所指向的存储单元所占的字节数加减;

  p++为下一个元素的地址

 例题:

 

 

 

  输出结果为 5.

 分析:*p =a+3 ——>*p=a[3]

    p[2] ——>p[0]=a[3],p[2]=a[6]

2.指针做加减运算一定要注意有效范围

int a[5];
int *iptr=&a[1];
iptr --;                  //指向&a[0]  
*iptr = 3;             //a[0]=3         
iptr--;                  //指向&a[-1],超出范围,危险           
*iptr = 6;            //危险

 

四、二维数组指针

1.定义:int (*p)[4];

先定义一个指向a的指针变量p;数组类型为int [4];a所包含的每一个一维数组的类型。即p指向一个“包含4int型元素的一维数组”

2.等价关系

  (1) P+i等价于&a[i];

  (2) *(p+i)等价于a[i];

  (3) *(p+i)+j 等价于a[i]+j 等价于&a[i][j];

  (4) *(*(p+i)+)等价于 a[i][j];

——a+1行加一即a[ 1 ],*(a)+1才是列的移动即a[0][1](地址加一)

3.数组表

 

 

 

 

 

 

posted @ 2021-11-20 18:20  吧拉吧拉吧  阅读(157)  评论(0编辑  收藏  举报