# 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)

(adsbygoogle = window.adsbygoogle || []).push({});