1.指针数组和数组指针
以二维数组表示开始:
int* a[10]:指针(的)数组 array of pointer,本质是数组,存储的内容是指向int类型的指针,因此大小为10*4=40,位于栈
int (*b)[10]:数组(的)指针pointer of array ,本质是指针,存储的内容是指向int数组的地址,因此大小是4,可以申请空间,申请的空间位于堆
例如int* a指针,a表示一个一维数组,初始化a=new int[10];
int (*)b[10] = new int[10][10],b表示一个二维数组,
int **ptr指向指针的指针,本质是指针,可表示二维数组
继续深化:3维数组表示
int* a[2][3]:指针数组,一个2*3二维数组,每个元素都是指向int类型数据的指针,大小为6*4=24
int** a[2]:指针数组,一个二维数组,每个元素都是指向int指针的指针,大小为2*4=8
int (*a)[2][3]:数组指针,指向一个2*3二维数组的指针,
int (**a)[6]:数组指针,指向一个 指向一维数组的指针 的指针
2.指针函数与函数指针
指针函数:本质是函数,是带指针的函数,即返回值是地址。如int* func(void);//声明一个函数原型
函数指针:本质是指针,是指向定义的函数的指针,值为地址。如int (*func1)(void);//定义一个指针变量func1
func1 = f1;//&f1
int f1(void);
进一步利用typedef定义函数指针数据类型 typedef int (*funcType)(void);//定义一个数据类型func
funcType f = f1;//&f1貌似取地址运算符可要可不要
注意funcType与func1已经有本质区别
最常用的用法是
int* f(void);//声明指针函数
.....
int* f(void){return (int*)malloc(4);}//定义函数体
3.指针常量与常量指针
常量指针:指针指向内容不可修改,是常量,内容位于常量区。
如下整型指针常量
int const * a;
const int *a;
示例:
int b = 8;
const int c;
*a = &b;//1位于常量区,不可再被修改
*a = 3;//非法,a指向内容不能修改
a = c;//合法,指针可以被修改
一般函数char* f(const char* st1);传入参数设置为常量指针,表示传入变量所指向内容在函数体内是不允许被修改的。
指针常量:指针本身是不可修改的,但指针指向内容可修改。
int* const a;
示例:
int b = 1;
int* c = &2;
a = b;
*a = 10;//合法,a指向内容可以被修改,同时b也变成10
a = c;//非法,指针a不可改变
对于字符串:
const char* str1 = “12345”;//则字符串指向字符串位于常量区,不可修改
str1[0]='a';//非法
char* s = new char[2];
char* const str2 = s;
str2 = new char[10];//非法,str2不能再被分配新地址
注意:
char* s = "12345";//非常量指针不能指向常量区
char* const s = "12345";//都是不被允许和建议,无法编译通过
vs上是可以,可能当时在vc上,各种蛋疼
进一步
char a[] = "abc";//为数组a分配3个单位内存,指向内容在栈上,与常量指针指向常量区有本质区别
//a是指针常量(char* const),不能再被重新赋地址
a[1] = 'g'//合法
char a[10]="123";//给数组前3位赋值,剩余位自动赋值为0,内容在栈上
4.