指针和数组
基本知识
数组名代表数组的首地址(两种特殊情况除外,一种是&arr,另一种是sizeof(数组名))(表示整个数组的大小)
sizeof(数组名)和sizeof(指针变量名)二者不可互换
a[i]实际上和*(a+i)访问的是同一个元素
指针的算术运算
p+j等价于&a[j],换一种方式访问数组元素
指针相减得到距离
//定义忽略 p=&a[i]; q=&a[j]; p-q=i-j;
指针与一维数组的关系
*(p+1)等价于a[i](首地址加偏移量)
不同点在于,p是指针变量,而a是指针常量
p++不是加1字节,取决于p的基类型
(*p)++和++(*p)
都是不可以连续访问的
输入
p++
输出
*p++
传递给函数的时候传递数组名或者指针
注:p+1实现不了连续访问的效果
指针与二维数组的关系
对于一个二维数组
a[i][j] *(a+i)相当于a[i] 所以*(*(a+i)+j)就相当于a[i][j]
行指针
int (*p)[3]; p=a; p+i就指向a[i] *(p+i)+j就指向a[i][j] 取元素解引用
列指针(将p看成一维数组)
int *p; p=a[0];//这一步相当于把a[0]看成一个整体 如果是int* p[3]那么表示存放指针的指针数组 (p+i*n+j); 或者p[i*n+j]
二维数组作函数参数
第二维不可省略
行列指针作函数参数
行指针
input(a,3,4) void input(int (*p)[N],int m,int n);
列指针
input(*a,3,4) voidinput(int *p,int m,int n);
字符数组和字符指针
数组名是常量,它的值不可以被修改,但是数组的内容是可以被修改的。
字符指针是一个变量,它的值可以被修改,但是由于其指向的是常量空间中的字符串,(如果指向字符数组就可以修改了)所以它所指向的空间中的内容是不能被修改的,这就是字符指针和字符数组的不同之处
对于字符指针解引用可以
指针数组和数组指针
指针数组
本质是数组,作用是存放指针;
int* arr[3]={&a,&b,&c};(这就是一个整型指针数组)
取元素的时候*(arr[i]);
数组指针
数组指针第一种指针,它表示指向数组元素首地址的一个指针
char (*pa)[4];
它和普通的指向数组首地址的指针的区别在于,对它进行加减操作移动的单位是一个数组,而普通的指向数组首地址的指针移动的单位是一个数组元素
指针数组和数组指针的根本区别就是运算符的优先级问题