# 1.数组指针与指针数组
- 数组指针:是数组的指针,指向数组的指针,指针的类型是数组,其指向数组内存空间的首地址
- 指针数组:存放指针的数组,变量首先是一个数组,数组的元素是指针
- 所以,数组指针是数组的指针,指针数组是存放指针的数组,两者根本就是不同类型的变量。
# 2.数组指针
其实是数组的指针,指针指向数组的首地址。
定义及使用:
char (*pointer_for_arr)[4];
// pointer_for_arr 是指向数组首地址的指针
char char_arr[4] = {'a','b','c','d'};
pointer_for_arr = char_arr;// 将报错,因char_arr是指向数组首元素地址的指针,指针类型是char,而pointer_for_arr是指向数组的首地址的指针,指针地址是char[4],指针类型不同所以会报错
pointer_for_arr = &char_arr; //正确,pointer_for_arr可以理解成二维数组的行指针,故可取char_arr地址给其赋值
# 3.指针数组
即存放指针的数组
定义及使用:
char *pina[2] = {"object","detection"};//这里pina是指向指针数组首元素的指针,数组pina存放了两个char类型字符串指针
char *pina[2]
数组是函数的普通变量,内存分配在栈区,常量"object"
分配在只读数据区,不能通过*(*pina+1)=’a'
的形式改数据。pina数组占了8个字节的内存,因1个指针占4个字节,数组共2个元素。
char *pina[2]
可参考类比char **pina
二维数组
# 4.数组指针与指针数组的使用
计算机的内存映像图:
内存映像象图 | 内容 | 权限 |
---|---|---|
栈区 | 函数中的普通变量 | 可读可写 |
堆区 | 动态申请的内存 | 可读可写 |
静态变量区 | static修饰的变量 | 可读可写 |
数据区 | 用于初始化变量的常量 | 只读 |
代码区 | 代码指令 | 只读 |
指针数组和数组指针之所以容易混淆,和
*,[]
运算符的优先级有密切关系指针数组: 用作函数的参数,调用函数时查传递二维数组的首地址而非将只读区的内存传过去,可以提高效率
如main
函数:
int main(int argc,char**argv);
// 或
int main(int argc,char*argv[]);
- 数组指针,作为函数的参数传递
在使用数组的时候,编译器通常会将其转换成指针,使用数组的名字其实用的是一个指向数组首元素的指针,当对数组使用下标运算的时候,编译器会自动执行指针的运算操作。
void func(int (*P)[4]);
int main(int argc,char*argv[]) {
int arr[3][4] = {0};
func(arr);// arr数组行指针
}
# 5.如何定义二维数组并初始化
// 动态创建而维数组并初始化
const int r = 10, c = 10;
bool **flag = NULL;
flag = new bool*[r];
for(int i = 0; i < r; i++) {
flag[i] = new bool[c];
}
// 动态的释放new出来的内存
for(int i=0; i<r; i++)
{
delete []flag[i];
flag[i] = NULL;
}
delete []flag;
flag = NULL;
注意区分数组指针int (*p)[10]
与指针数组int *p[10]
的不同,可以参考 (opens new window)。