//声明: 1.&----取地址运算符 eg: int m = 1; int *p = &m;//(*p) == m的地址 == &m; 2.*----间接访问运算符 eg: int n = 2; int *q = n;//(*p) == n
/*
Date:2017-05-23
Author:Johnny Zen
Author:Johnny Zen
数组指针与指针数组
*/
/*
数组指针(也称行指针)
定义 int (*p)[n];
地址表示: p[j] p+j
值引用表示: (*p)[j]
本质:数组指针只是一个指针变量
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,
这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
*/
#include<iostream> #include<stdlib.h> using namespace std; #define n 2 #define m 3 int main(){ int array[n][m] = {1,2,3,4,5,6}; int (*p)[m] = array;//行指针;p可指向二维数组a的某一行(所以:p数组长度与要与二维数组的列长度一致) for(int i = 0; i < n;i++){ for(int j = 0; j < m; j++){ // printf(" [array[i][j]:%d p[i][j]:%d] ",array[i][j],p[i][j]); printf(" [array[i][j]:%d p[i][j]:%d] ",array[i][j],*(p[i]+j));//二者等效 ;注意:p[i]+j:将指向p[i][j]的地址 } printf(" "); } return 0; } //output: /* [array[i][j]:1 p[i][j]:1] [array[i][j]:2 p[i][j]:2] [array[i][j]:3 p[i][j]:3] [array[i][j]:4 p[i][j]:4] [array[i][j]:5 p[i][j]:5] [array[i][j]:6 p[i][j]:6] */
/*
指针数组
定义 int *p[n];
地址表示: p[i]
值引用表示:*(p[i]+j) *p[i]
本质:指针数组是多个指针变量
表示:数组a中的元素都为int型指针 素表示:*a[i] *(a[i])是一样的,因为[]优先级高于*
[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1是错误的,这样赋值也是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组:
int *p[3];
int a[3][4];
for(i=0;i<3;i++)
p[i]=a[i];
这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
*/
void PointArray(){
const int n = 3;
const int m = 4;
int *p[3]; //[]优先级高
int a[n][m];
for(int i = 0;i<n;i++){
for(int j=0;j<m;j++){
a[i][j] = rand();
cout<<a[i][j]<<' ';
}
cout<<endl;
}
//p[i] //显示第i行首元素的地址
//*p[i] //显示第i行第1个元素的数值
//*(p[i]+2) //显示第i行第3个元素的数值
for(int i=0;i<3;i++){
p[i]=a[i];
cout<<p[i]<<' ';
cout<<*(p[i]+1)<<' ';
}
}
int main(){
// ArrayPoint(); //数组指针
PointArray(); //指针数组
return 0;
}
/*
小结:
数组指针 指针数组
定义 int (*p)[n] int *p[n]
地址表示 p[j] or p+j p[i]
值引用表示 (*p)[j] (先指针引用,再定位) *(p[i]+j) or *p[i] (先定位,再引用值
*/