一,指針與二維數組
1.二維數組
例如:
int a [3] [4] = {{1,2,3,4},{5,6,7,8},{9,10,11 ,12}};
a [0] [0]
a [0] [1]
a [0] a [0] [2]
a [0] [3]
a [1] [0]
a a [1] a [1] [1]
a [1] [2]
a [1] [3]
a [2] a [2] [0]
a [2] [1]
a [2] [2]
a [2] [3]
結論:
a <=>&a [0]
a + 1 <=>&a [1]
a [0] <=>&a [0] [0]
a [1] <=>&a [1] [0]
a [2] <=>&a [2] [0]
例:
printf(“a [0] [2] =%d%d \ n”,a [0] [2],*(a [0] +2)); // 3由a [0]得到a [0] [2]
printf(“a [0] [2] =%d \ n”,*(* a + 2)); // 3由數組名a得到a [0] [2]
二,
數組指針(行指針) 本質:是指針,只不過指針指向的內容是數組;
1.形式
存儲類型數據類型(*數組指針變量名)[列數]; eg1
:
int(* p)[10]; //定義了數組指針p,p指針指向有10個int型元素的一維
數組p + 1:向地址大的方向偏移1個數據類型; eg2
:
int a [3] [4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int(* p)[4] = a; //初始化
int(* q)[4];
1>二維數組中第i,j個元素的表示:(i爲行:0,1,... j爲列:0,1,....)
a [i] [j] p [i ] [j] *(*(a + i)+ j)*(*(p + i)+ j)
2>二維數組中第i,j個元素的地址表示:(i爲行:0,1 ,... j爲列:0,1,....)
&a [i] [j]&p [i] [j] *(a + i)+ j *(p + i)+ j
練習:
使用行指針實現二維數組中各個元素之和;
三,指針
數組本質:是數組,只不過數組中各個元素是指針;
1,形式
存儲類型數據類型*數組名[元素個數];
eg1:
int * a [5]; //定義了一個有5個元素的指針數組a,每個元素的數據類型爲int *
int i,j,m,n,k;
a [0] =&i;
a [1] =&j;
a [2] =&m;
a [3] =&n;
a [4] =&k;
eg2:
int i,j,m,n,k;
int * a [5] = {&i,&j,&m,&n,&k}; //定義了一個有5個元素的指針數組a,每個元素的數據類型爲int *
eg3:指針數組操作二維數組
int a [3] [4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int * b [3] = {a [0],a [1],a [2]};
總結:
一維數組名相當於一級指針;
二維數組名相當於行指針;
指針數組名相當於二級指針;
四,多級指針變量
1.多級指針概念
指向指針變量的指針變量,叫多級指針變量;
例如:
int ** p;
2.一級指針變量
指向處理數據的指針變量稱爲一級指針變量,簡稱一級指針;
例如:
int i = 10;
int * p =&i; // p爲一級指針變量
3.二級指針變量
指向一級指針變量的指針變量,叫二級指針變量;
例如:
int i = 10;
int * p =&i;
int ** q =&p; // q爲二級指針
4.二級指針變量的形式
存儲類型數據類型**指針變量;
例如:
int i = 10;
int * p =&i;
int ** q =&p; // q爲二級指針
printf(“%d \ n”,* p);
printf(“%d \ n”,** q);
五,void型指針
1.不確定數據類型的指針;
2.形式
void *指針變量名;
例如:
void * p; // p是不確定數據類型的指針;
3.運算
對於虛型的指針變量,實際使用時,一般需通過強制類型轉換才能使空型指針變量得到具體變量或數組地址。
在沒有強制類型轉換之前,虛型指針變量不能進行任何指針的算術運算。
注意:
可以將任意數據類型的指針賦予void型指針;
絕不可以將虛型指針賦予確定數據類型的指針;
練習:
void型指針變量一維數組;
int a [10] = {1,2 ,3,4,5,6,7,8,9,10};
void * p = a;
int i;
for(i = 0; i <10; i ++)
printf(“%d”,((int *)p)[i]);
六.const指針
1.形式
1> const修飾指針指向空間的值
const數據類型*指針變量名;
等價:數據類型const *指針變量名;
含義:
不能通過指針變量去修改指針變量指向空間的值,但變量本身的值可以被修改;
例如:
int i = 10;
const int * p =&i; //
* p = 20;(×)//不能通過指針變量修改指針變量指向空間的值;
i = 20;(√)
2> const修飾指針本身
形式:
數據類型* const指針變量名;
含義:
不能修改指針的指向,但可以通過指針修改指針指向空間的值;
例如:
int i,j;
我= 20;
j = 30;
int * const p =&i;
p =&j;(×)//不能修改指針變量p的指向
* p = 50;(√)
3> const既修飾指針指向空間的值又修飾指針變量本身
形式:
const數據類型* const指針變量名;
含義:
既不能通過指針變量修改指針變量指向空間值,也不能修改指針的指向;
例如:
int i,j;
我= 20;
j = 30;
const int * const p =&i;
i = 30;(√)
* p = 30;(×)//不能通過指針變量修改指針變量指向空間的值
p =&j;(×)//不能修改指針的指向